2008/05/29(Thu)
○[NetBSD] shared library with -lc しょの4
ふーん、NetBSDはld.elf_so(1)にLD_TRACE_LOADED_OBJECTS環境変数が実装されてない
*1のね。
だもんでldd(1)は自前でELF headerを解析してるちゅーことだ。
http://cvsweb.netbsd.org/bsdweb.cgi/src/usr.bin/ldd/ldd_elf/ldd.c
static void
print_needed(Obj_Entry *obj, const char *fmt1, const char *fmt2)
{
const Needed_Entry *needed;
for (needed = obj->needed; needed != NULL; needed = needed->next) {
const char *libname = obj->strtab + needed->name;
if (needed->obj != NULL) {
print_needed(needed->obj, fmt1, fmt2);
if (!needed->obj->printed) {
fmtprint(libname, needed->obj, fmt1, fmt2);
needed->obj->printed = 1;
}
} else {
fmtprint(libname, needed->obj, fmt1, fmt2);
}
}
}
んでldd(1)の結果と実際のld.elf_soの処理順が一致してないちゅーバグがあると。
Linuxだとldd(1)はbash scriptだし、FreeBSD/OpenBSDはCで書かれてるけど
どれもこれもLD_TRACE_LOADED_OBJECTSをセットしてfork(2)してるだけやね。
それとld.elf_soって
.init/.finiの実行順が腐ってたのを
最近直したのか。
そもそも
この話はlibc major crunkが発端だったのだけど、いつの間にか
ELF Dynamic Flagsの使い方の話にも進展してたんだ、へぇ。
ちゅーわけでNetBSDならlogin.confに
defaults:\
:setenv=LD_TRACE_LOADED_OBJECTS=1:\
...
とか書いても何ともないぜ(やめなさい
○[NetBSD] multi-locale その12
catopen(3)のmulti-locale化、それ自体は簡単な作業なんだが
そもそもgencat(1)の吐くmessage catalogsってMIだったっけ?ちゅうのがあるよな。
昔のSun gettext(3) + msgfmt(1)にはPRI*マクロなんか使うとMD問題があるので
GNU gettext(3)ではformat変更までしてMI対策した記憶があるのだけど。
まあサポートしてないならないでprintf(3)のformatには使うな
とでもマヌアルにのCAVEATSにでも書いときゃいいんだが。
今更そんなこというなという噂もある。
ちなみにPRId32マクロ
#include <stdint.h>
int
main(void)
{
printf("%"PRId64"\n", 0);
}
をxgettext(1)使ってぶっこ抜くと
msgid "%<PRId32>\n"
msgstr ""
ちゅー感じになる。
あとLC_MESSAGES=ja とかlanguageだけ指定してる場合のケアどうすっかだな。
gettext(3)はmo catalogのヘッダにcharset埋め込んで
iconv(3)で変換とかそれってどうよ?な事やってるんだけど、format変わっちまうしな。
単純にケアしない、もしくはlocale.aliasでja -> ja_JP.eucJPへのaliasを貼るでいいよな。