2012-04-30 4 views
1

私は、既存のglibcターゲットgcc/binutilsツールチェーン上でuClibcを使用できるようにするためにスクリプトを作成しています。残った1つの問題は、pthread_canceldlopenlibgcc_s.so.1になることです。ホストのgccで提供されているバージョンは、glibcのに依存するようにリンクされているので、私が代わりに交換libgcc_s.so.1作るためにlibgcc_eh.aから必要なシンボル(とその依存関係)に引っ張ってldさん-uオプションを使用しています:隠し視認性シンボルをGNU binutilsで再表示する方法はありますか?

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のすべてのシンボルは可視性がhiddenに設定されているので、出力.soファイルではすべてローカルになり、.dynsymシンボルテーブルに追加されません。

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

答えて

1

objcopyで--globalize-symbolを使用できるはずです。

 
$ 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シンボルにobjcopyをするには、いくつかの時間を提供することができますが、明示的にグローバル化したいすべてのシンボルの完全なシンボル名を言及する必要があります。

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

+0

おそらく 'libgcc_eh.a'のオブジェクトファイルは、共有された' libgcc_s.so'が使われていないときに引っ張られるので、PIC共有ライブラリやPIE実行ファイルで使えるはずですが、間違いかもしれません。いずれにしても、textrelが許可されているi386では少なくとも動作します。 –

+0

あなたの編集を見ただけです。なぜなら、コードがPICとしてコンパイルされている理由を説明していると思うからです。 –