2016-03-29 8 views
0

私たちはサードパーティ製の静的ライブラリを使用しています。つまり、アンドロイド開発用にA.aとしましょう。私たちは共有ライブラリとしてリンクし、1つのアプリケーションで正常に動作しますが、別のC.soをビルドするのにB.soを使用すると、A.aの一部のシンボルが見つかりません。すでに-Wl,--export-dynamic-Wl,--whole-archiveを使用してB.soをビルドしています。これらのシンボルを確認するのにnmを使用していますが、存在しますが、“T”の代わりに“t”と表示されます。つまり、外部シンボルではなくローカルシンボルです。継ぎ目A.aはsom調査の後に-fvisibility=hiddenでビルドされています。リンク時に-fvisibility = hiddenをオーバーライドする方法はありますか?

しかし、何らかの理由で新しいビルドライブラリをすぐに入手することが難しいため、回避策が必要です。リンク時にB.so-fvisibility=hiddenでビルドされていても、これらのシンボルをグローバルとしてエクスポートする方法はありますか?

答えて

0

私たちは、あなたがいけないそれらのシンボル

をチェックするためにNMを使用しています:ELFプラットフォームで、nmは仕事のため不十分です。代わりにreadelf -Wsを使用してください。

"T"の代わりに "t"と表示されますが、これは外部の代わりにローカルシンボルであることを意味します。縫い目は、A.aは、somの調査の後に-fvisibility = hiddenでビルドされています。

あなたの結論は従っていません。記号はtとして表示されることがあり多く理由があります。 -fvisibility=hiddenでコンパイルすることは、多くの可能性のうちの1つに過ぎません。

でも、シンボルテーブルがElf{32,64}_Sym[]秒のちょうどリニアテーブルです-fvisibility=hidden

で構築された世界としてこれらのシンボルをエクスポートする方法はあります。あなたが持ってたら

sym-offset = .symtab offset + (sym-number * sizeof(Sym)) 

:次の2つを組み合わせることにより、foo.o内のシンボルのオフセット、readelf -WS foo.o | grep '\.symtab'を持つオブジェクト・ファイル内のこのテーブルの開始を見つけるreadelf -Wsから、問題のシンボルの番号を検索し、見つけることができますオフセットは、.st_infoSTV_DEFAULTに上書きすることができます(理論が正しく、シンボルを正しく配置している場合は、現在STV_HIDDENが存在するはずです)。

foo.oにパッチを適用すると、シンボルは非表示にならなくなり、foo.oB.soにリンクすると、グローバル/エクスポートされます。

関連する問題