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

2010/04/16(Fri)

[NetBSD] Only one ABI change in libc, in more than 15 years!(その3)

さて誰得な気もするけど、昨日のチラシの裏のつづきにして最後。

(これまでのうらすじ)

昔々 libfoo.so.12 のところに foo というシンボルがありました。
このシンボルを call すると、"hello, libfoo12."というどうでもいい文字列を表示します。

ある日のことどっかのloopyな王様が仕様変更を唱えまして、"hello, libcfoo13."と表示しなければならなくなりま。
困ったことにこの変更でバイナリ後方互換が壊れてしまった(ということにしといてくらはい)ので
*BSD 村一番の後方互換パラノイア、NetBSD は、奥義 __RENAME マクロを使って対処しました。

ですので古いバイナリは foo を呼びますが、新しいバイナリは ヘッダ中ですりかえられた
__foo60 を呼んでます、ですのでバイナリ後方互換は守られみな幸せに暮らしましたとさ(おわr

このすりかえは ヘッダをインクルードせずに extern foo した場合には just won't work on youですが
まぁその場合は __warn_references マクロでリンク時警告出してますんで自己責任ということで。

そもそも __RENAME マクロは共有ライブラリのの soname を変更したくない為の怪しげな voodoo です。
ですので major を crunk するといちど決めてしまえば "hello, libfoo12." を表示する foo の方はもはや不要です。
そして "hello, libfoo13."を表示する __foo60 は元の正しい名前、foo としてコンパイルして欲しいわけです。

ですので libfoo12.tar.gzから libfoo13.tar.gzで以下の書き換えを行いました。

とまぁこんな感じでヘッダとMakefile関係をちょびっと書き直すだけで major crunk 前後にうまく対応してるわけです。

はい、ややこし過ぎてとても正気の沙汰とは思えませんです :D うまくない!

しかも弱点がこれあって、foo.c が1関数で完結してないと駄目だよねという、それともstatic な関数
とかはまだしも、libc内部でだけ使われるシンボルも全部 __RENAME しちゃうんですかね。
とーっても無駄すぎると思うのですが。

あと compat だと 1回の soname 変更にしか対応できないよね、次に libfoo14 とかが必要になる事態まで考えてないよね。
libfoo13/compat じゃなくて libfoo13/compat12 としといた方がいいんじゃないの、とかかなぁ。

とまぁこんな感じです。トリックが無駄にややこしいので私の貧弱な文章力では何人理解できるか大変不安、ごめんちゃい。