1

プロジェクトでは、 で指定された一連の関数をエクスポートする共有オブジェクト ファイルを作成しようとしています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が必要であることです。個々のオブジェクト ファイルとアーカイブ ファイルのリンクに違いはありません。

4

1 に答える 1

1

このオプションを使用し-u SYMBOLて、アーカイブからオブジェクトを強制的に読み込むことができます。

% cc -c -fPIC a.c
% nm a.o
00000000 T a
% ar rv liba.a a.o
ar: creating liba.a
a - a.o
% gcc -o liba.so -shared -u a liba.a
% nm liba.so | awk '$3 == "a" { print }'
0000042c T a

チェックすべきことの 1 つは、 で指定されている記号のスペルです--retain-symbols-file。たとえば、C++ コードからコンパイルされたオブジェクトのシンボル名はマングルされる可能性があります。

% g++ -c -fPIC a.c
% nm a.o | awk '$2 == "T" { print }'
00000000 T _Z1av
于 2012-09-27T01:48:32.983 に答える