蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2010年04月14日分

2010/04/14(Wed)

[NetBSD] Only one ABI change in libc, in more than 15 years!

NetBSDでは後方互換が壊れるような変更をlibcに加える場合、__RENAME()マクロというトリックを使い
ABIを保ち、libcのsonameを変更をしないですむ(OpenBSDのような賽の河原とか嫌だし)ように工夫してるのは
以前もこのチラシの裏に 書いた通りです。

やっぱりこれもっと宣伝すべきよね

Only one ABI change in libc, in more than 15 years!

ちなみにこの一回ってのもa.out → ELFのことだからGNU toolchainのせいだしね:D

#っても今や他のOSはもっとナウい(死語)方法(ELF symbol versioning *1)で実現してるので、ちょっと恥ずかしいかもしれない。

ところがですね、来るreleng-6ではtime_tの64bit化による2038年問題解決がスケジュールされとりまして
time_tのsizeofがかわるってーのはlibcの__RENAMEだけでABIを保証するのは 厳しいものがありまして
2回目のABI変更、すなわちlibcのsoname変更 や ら な い か、という決定が下されまして、その為のもろもろの準備が
src/libc/compat以下で進められとりやす。

他のOSなんかだとglibcだとlibc5とglibc2(libc6)なんてのは別リポジトリで進化してますので
メンテナンスはそれぞれ個別ですし、FreeBSDなんかだとメジャーリリース(例えば2.2から→3.0みたいな)毎に
libcのmajorはcrunkしますので、その枝のstableをメンテしているわけです(ports/misc/compat*参照)。 *2

NetBSDもFreeBSDのようにstable branchで後方互換の為の古いlibc(libc12)をメンテしていく方が楽なのですが
残念ながらstable branchを保守していくにはその枝の寿命の問題があります。

最近のFreeBSDのEOLポリシーはよう知らんですが、NetBSDの場合は6.0がリリースされるとその2つ前、つまり4.x系が
EOLになりますので、ここ最近は2年に一度程度のメジャーリリースですから *3libc12をリンクしたアプリの寿命は
あと4年程度ということになってしまいます、せっかく12年間守り続けた後方互換ですのでこれはなんとも勿体無い話なわけです 。

一方、XFree86/xorgでも3系から因縁の4系に移行する際(だったっけ?)にXaw(X Atena Widget)のmajorが変更になりました。
ですが3系をとっとと捨てたかったのか:D 4系のコードベースからlibXaw6(旧)とlibXaw7(新)という異なるABIのライブラリを
どちらもビルドできるよう上手いことやっとります、このためlibXaw6にはいまのところ寿命設定なしで保守され続けてるわけです。

んでNetBSDもそれにインスパイヤされたのかどうかは知らんですが、cvsのHEADでlibc12とlibc13両方をビルドできるようにして
今後もlibc12の保守をしていくことになったようです *4

んでもですね、このlibc/compat以下のカラクリってのがどこにもドキュメントが無いまま作業が進められてて
(the typical NetBSD style we did not document/advertise it. といういつもの悪癖です、はい)手が出しづらい状況なんすよね。
なもんで、今後どういう風にlibc12からlibc13への以降をやろうとしてるのかたぶんこんな感じじゃね?と
風の息づかいを感じたので、次回に記事を書いてみる予定。

たぶんdeveloperなら このサンプルこのサンプルの差分をみただけで理解できると思われ。

というかこれまで理解してなかったのは俺だけかもしれない、くっ。

*1:GSoCで何かやりたい学生さん、どうっすかね?
*2:ちなみにOpenBSDの場合「バイナリ互換なんぞ知るかボケ、半年に一度リリースソング聴きながら再インストールしやがれ」でんな。
*3:6はそろそろ枝切りの予定、5.1が出ないことについては深く追求しないで下さい:-P
*4:かつてmatt@氏がlibc13はlibc12のwrapperとして提供しようぜ と 提案してたのですが
これバイナリレベルでのwrapperだと 問題あるので、ソースレベルでやろうぜってことだったのだと思われまする。