The Man Who Fell From The Wrong Side Of The Sky:2009年2月9日分

[最新版] [一覧] [前月] [今月] [翌月]

2009/2/9(Mon)

[NetBSD] __deregister_frame_info^2

FreeBSDのcommit logみると こんな対応してるみたいだけど
このdiffのようなfake symbolをセットする対応自体はNetBSDもとっくにやっとるので関係ないな。

        /*
         * If we found no definition and the reference is weak, treat the
         * symbol as having the value zero.
         */
        if (def == NULL && ELF_ST_BIND(ref->st_info) == STB_WEAK) {
                if (in_plt) {
                        _rtld_error(
                            "%s: Trying to call undefined weak symbol `%s'",
                            refobj->path, name);
                }
                rdbg(("  returning _rtld_sym_zero@_rtld_objself"));
                def = &_rtld_sym_zero;
                defobj = &_rtld_objself;
        }

src/libexec/ld.elf_so/arch/i386/mdreloc.cの_rtld_relocate_plt_objectとか眺めた感触としては
やっぱりcrtbeginS.o *1は__(de)?regisrer_frame_infoへのweal referenceを持ってたらダメな気がするんだよな。

NetBSDの場合のリンクオプション

$ gcc -### -shared -o libbar.so bar.c
Using built-in specs.
(中略)
"ld" "-shared" "-o" "libbar.so" "/usr/lib/crti.o" "/usr/lib/crtbeginS.o" "/var/tmp//ccgdmwa0.o"
"-lgcc_pic" "-lc" "-lgcc_pic" "/usr/lib/crtendS.o" "/usr/lib/crtn.o"

$ nm /usr/lib/crt*S.o | egrep "__(de)?register_frame_info"
         w __deregister_frame_info
         w __register_frame_info

Linuxの場合の以下同文

$ gcc -### -shared -o libbar.so bar.c
Using built-in specs.
(中略)
"/usr/libexec/gcc/i386-redhat-linux/4.3.2/collect2" "--eh-frame-hdr" "--build-id" "-m" "elf_i386"
"--hash-style=gnu" "-shared" "-o" "libtest.so" "/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../crti.o"
"/usr/lib/gcc/i386-redhat-linux/4.3.2/crtbeginS.o" "-L/usr/lib/gcc/i386-redhat-linux/4.3.2"
"-L/usr/lib/gcc/i386-redhat-linux/4.3.2" "-L/usr/lib/gcc/i386-redhat-linux/4.3.2/../../.."
"/tmp/ccKHu6ho.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc"
"--as-needed" "-lgcc_s" "--no-as-needed" "/usr/lib/gcc/i386-redhat-linux/4.3.2/crtendS.o"
"/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../crtn.o"

$ nm /usr/lib/gcc/i386-redhat-linux/4.3.2/crt*S.o | egrep "__(de)?register_frame_info"

ちゅうことで、crt*のソースを眺めてみると、--eh-frame-hdrつきでリンクすりゃ
__(de)?register_frame_infoは不要ってことみたい、src/gnu/dist/gcc4/gcc/crtstuff.c参照。

 89 #if defined(OBJECT_FORMAT_ELF) && defined(HAVE_LD_EH_FRAME_HDR) \
 90     && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
 91     && defined(__GLIBC__) && __GLIBC__ >= 2
 92 #include <link.h>
 93 # if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
 94      || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
 95 #  define USE_PT_GNU_EH_FRAME
 96 # endif
 97 #endif
 98 #if defined(EH_FRAME_SECTION_NAME) && !defined(USE_PT_GNU_EH_FRAME)
 99 # define USE_EH_FRAME_REGISTRY
100 #endif

288 #ifdef USE_EH_FRAME_REGISTRY
289 #ifdef CRT_GET_RFIB_DATA
290   /* If we used the new __register_frame_info_bases interface,
291      make sure that we deregister from the same place.  */
292   if (__deregister_frame_info_bases)
293     __deregister_frame_info_bases (__EH_FRAME_BEGIN__);
294 #else
295   if (__deregister_frame_info)
296     __deregister_frame_info (__EH_FRAME_BEGIN__);
297 #endif
298 #endif

しかしそれNetBSDやるとかなりの大災害だよね、バイナリ互換なくなる気がするんだけど
そうすっとまーた全部再コンパイル以下略

結局はld.elf_soでいちいち警告出してるのを黙らせるしかないんじゃないかという感触。
in_pltフラグをゴニョるか引数増やしてもいっこflag立てるか。


*1:crtbeginS.oが-sharedで、crtbeginT.oが-staticでlinkされる。

今日

ギクリ、現状Citrusのドキュメントって

しかないのでやらんとまずいのですよね、某developerにも散々文句いわれてますし *1

政府紙幣、一方アメリカは貧困層にクレカをばら撒いた、ばら撒いた結果がこれだよ!
20万で金買ってインフレに備える使い道が一番多かったりしそうな日本人。


*1:しかし返事書いてない(苦笑)


[ホームへ] [ページトップへ]