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

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:\
...

とか書いても何ともないぜ(やめなさい

*1:どーりで/usr/pkg/emul/linux/usr/bin/lddにNetBSDバイナリ食わせると
ただのlauncherとして動作するわけだわwww

[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を貼るでいいよな。