1

my_static_lib実行可能なバイナリ ファイルにリンクする静的ライブラリ ( ) があります。すべてではありませんが、一部のシンボルが私のバイナリで使用されています。

2 番目のライブラリ、dynamic loaded( my_shared_lib) は、バイナリからのシンボル インジェクションによって my_static_lib からいくつかのシンボルを受け取ることを期待しています。しかし、これらのシンボルは my_binary では使用されないため、最終的な bin ファイルから取り除かれます。

そのため、実行時に、my_shared_lib見つから__my_stripped_symbols__ずクラッシュすると不平を言います。

リンカーを強制的に保持する方法はあり__my_stripped_symbols__ますか? Makefile.am (autotools) にきれいに記述できるものが望ましい

(-binary file makefile)
-L$(top_builddir)/static_lib -lmy_static_lib --magic-flag-to-keep-stripped-symbol

実行可能ファイル/共有ライブラリのかなり複雑なグループの他の部分で奇妙な競合が発生するため、リンクmy_static_libしたくありません。my_shared_lib

4

1 に答える 1

4

アプリケーションにリンクmy_static_libするときは、オプションを使用し--whole-archiveます。ld options docsに記載されています。

gcc でリンクしている場合は、次のようになります。

-L$(top_builddir)/static_lib -Wl,-whole-archive -lmy_static_lib -Wl,-no-whole-archive

これにより、実行可能ファイルが使用する特定の関数だけでなく、ライブラリ全体が確実に保持されます。

また、シンボルがエクスポートされることを確認する必要があります。スタティック ライブラリのシンボルがまだエクスポートされていない場合は、エクスポートするシンボルをマークアップするために-fvisibility=hiddenと を使用する必要があります。gcc docs__attribute__ ((visibility("default")))でそれについてもう少し読むことができます

于 2012-12-13T08:48:56.953 に答える