プロジェクトでは、 で指定された一連の関数をエクスポートする共有オブジェクト ファイルを作成しようとしていますlibname.exports
。もちろん、ファイルの.so
リンク元となるオブジェクト ファイルは を使用して作成する必要が-fPIC
あることはわかっているため、これは処理済みです。次に、オブジェクト ファイルを という名前のアーカイブに結合しましたlibname.a
。これは、ファイルを作成するための基礎となるはず.so
です-またはそうでした。
に渡しlibname.exports
て--retain-symbols-file
いるので、期待される動作は、リンカーが.a
それらのシンボルに関連するメンバーのいずれかを取り込むことでした。
ただし、の出力nm libname.so
は空です。一方、grepping innm libname.a
は、in という名前の関連するシンボルがメンバーにlibname.exports
存在することを示しています。.a
今、私はつまずいた--whole-archive
ので、コマンドラインを次のように調整しました:
gcc -o libname.so -shared -Wl,-z,defs,--retain-symbols-file,libname.exports,-L. libname.a -lc
に:
gcc -o libname.so -shared -Wl,-z,defs,--retain-symbols-file,libname.exports,-L.,--whole-archive,libname.a,--no-whole-archive -lc
からのすべてのオブジェクト ファイルを含めるという意図された効果があるように見えます.a
(ただし、サイズの違いは奇妙です)。ただし、nm libname.so
まだ出力がありません。
アーカイブ ファイルを使用して、libname.exports
表示されている名前のシンボルのみを含む共有オブジェクトを作成するにはどうすればよいですか?
残念ながら、静的ライブラリから共有オブジェクト ファイルを作成する方法は、私の質問にはまったく答えていません。
注:質問する前に。ファイルを入力として使用する背後にある考え方.a
は、パターン ルールを簡単に使用できるようにすることGNUmakefile
と、いずれにしても.a
ファイル-fPIC
が必要であることです。個々のオブジェクト ファイルとアーカイブ ファイルのリンクに違いはありません。