| ・gcc2.7では、libcの中の(de)register_frame_infoシンボルをリンクしていた
| ものを、egcs(gcc2.8)では、libgcc.aで提供するシンボルを静的にリンク
| する方式に変わった為、
| ・egcs(gcc2.8)で、コンパイルしたlibcには、(de)register_frame_infoシンボル
| が存在せず、
| ・gcc2.7でコンパイルしたプログラムは、(de)register_frame_infoシンボル
| の解決ができない。
|
| というものです。これは正しいでしょうか? 私自信、この情報をどこで入手
| したのか忘れてしまいました。以前の gccやglibcの配付に含まれていた
| ドキュメントだったような気がしますが、現在の配付にはこの記述を見付ける
| ことが出来ませんでした。
|
| この問題に関するより正確な情報、または、これへのポインタがあれば教えて
| 頂きたく。
僕はlibc hackerでないので詳しいことはわからないのですが、うちのLinuxの
glibcは(egcs-1.1.1でコンパイル)
$ cd /lib
$ nm libc-2.0.108.so |grep register_frame
000d3d50 T __deregister_frame
000d3cf4 T __deregister_frame_info
000d3c48 T __register_frame
000d3bf8 T __register_frame_info
000d3c78 t __register_frame_info_table
000d3cc4 T __register_frame_table
$
のようになっています。次の事例はHurdに関することで、Linuxの
場合はどういうことになるのか知らないのですが、Hurdの場合
$ i586--gnu-nm libc-2.0.105.so|grep register_frame
U __deregister_frame_info
U __register_frame_info
のようにコンパイルされたlibcではglibc-2.0との互換性が失なわれてしまいます。
$ i586--gnu-nm libc-2.0.106.so |grep register_frame
0010f0b4 T __deregister_frame
0010f054 T __deregister_frame_info
0010efb4 T __register_frame
0010ef68 T __register_frame_info
0010efe0 t __register_frame_info_table
0010f028 T __register_frame_table
のようになってはじめてglibc-2.0の互換性が保たれます。Hurdの場合、上のような
libcがコンパイルされないための方法はあるのですが、Linuxの場合はちょっと
わかりません。
僕がやるとすれば、glibc-2.0.108のヘッダを使って'さら'からegcsをコンパイル
しなおしてから、glibcをコンパイルしてみることでしょうか...
以下はこの件に関してのMark Kettenisさんのメールです。
Check if you shared libc (libc.so.0.2) contains the function
__register_frame_info.
$ nm libc.so.0.2 | grep register_frame
0010c5fc T __deregister_frame_info
0010c570 T __register_frame_info
0010c5b8 t __register_frame_info_table
if they are undefined (they have a capital U in the second column),
your shared libc has been built incorrectly. The easiest solution is
to build glibc from scratch. Alternatively you can remove all shared
libraries in your build tree. It is important to remove all shared
libraries because otherwise the exception handling functions will be
found in another library and the linker won't add them to libc.
---
UCHIYAMA Yasushi
uch _at_ ddd.scei.sony.co.jp