3

uClibc を既存の glibc ターゲットの gcc/binutils ツールチェーンで使用できるようにするスクリプトに取り組んでいpthread_cancelますdlopen libgcc_s.so.1。ホスト gcc で提供されるバージョンは glibc に依存するようにリンクされているため、代わりにld-uオプションを使用して、必要なシンボル (およびその依存関係) をlibgcc_eh.aから取得し、置換を行いlibgcc_s.so.1ます。

gcc -specs uclibc.specs -Wl,-u,_Unwind_Resume -Wl,-u,__gcc_personality_v0 \
    -Wl,-u,_Unwind_ForcedUnwind -Wl,-u,_Unwind_GetCFA -shared -o libgcc_s.so.1

原則としては完了ですが、すべてのシンボルlibgcc_eh.aの可視性が非表示に設定されているため、出力ファイルではすべてローカルになり、シンボル テーブル.soに追加されません。.dynsym

これらのシンボルを再表示するために、ファイルまたは元のファイルでbinutils (おそらくobjcopy? またはリンカー スクリプト?)を使用する方法を探しています。これは可能ですか?.so.olibgcc_eh.a

4

2 に答える 2

1

--globalize-symbolobjcopyで使えると思います。

例えば

$ nm /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a | grep emutls_alloc

00000000 t emutls_alloc
$ objcopy --globalize-symbol=emutls_alloc /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a /tmp/libgcc_eh.a
$ nm /tmp/libgcc_eh.a |grep emutls_alloc
00000000 T emutls_alloc

--globalize-symbol を objcopy に数回指定できますが、グローバル化するすべてのシンボルの完全なシンボル名を明示的に指定する必要があります。

libgcc_eh.a はおそらく -fpic/-fPIC なしでコンパイルされるため、libgcc_eh.a を共有オブジェクトに変換するときにどのような破損が発生するかはわかりません。libgcc_eh.a は、位置に依存しないコードとしてコンパイルされていることがわかります。

于 2012-08-17T18:31:02.457 に答える