オブジェクトファイルをいくつかのアーカイブファイルにリンクしてELFファイルを作成しています。しかし、ELFファイルで「what」コマンドを実行すると、すべてではなく一部のアーカイブファイルのlib情報(バージョン)のみが表示されます。
ELFファイルがすべてのアーカイブファイルにリンクされていても、一部のファイルの情報しかないのはなぜですか?(追記:すべてのアーカイブファイルにはバージョン情報があります。以下の例を確認してください)
例:
$ ld -o bos_epb.ppc.elf a.o b.o c.o -L/home/xrava/lib/powerpc \
--start-group -lgcc -lm -lcrt -lsslcrypto -lssh --end-group
ELFファイルで「what」を実行すると、libcrtに関するlib情報のみが表示され、すべてではありません。
$ what bos_epb.ppc.elf
bos_epb.ppc.elf:
Lib crt swfp version BL910288
C Run Time Library
Built Fri 22 Apr 2016 23:31:21 +0200 by tefo@
Copyright 2016 XXXXXXX
私のすべてのアーカイブにはバージョン情報がありますが、libcrtを除いてこれをelfに書き込んでいません。
>>what libssh.a
libssh.a:
Lib ssh swfp version BL910291
SSH Built Wed 27 Apr 2016 23:36:24 +0200 by tefo@
Copyright 2016 XXXXXXXX
私のすべてのアーカイブにはバージョン情報がありますが、libcrtを除いてこれをelfに書き込んでいません。
この結果を理解するには、理解する必要があります
what
コマンドが動作し、ショーで。what
コマンドは非常に簡単です:それは探して任意のバイナリをスキャンして、「特別な」記号列で始まるASCII文字列@(#)
とプリントそのシーケンス(で終わる次の任意の文字列NUL
の文字が)。ドキュメント。
@(#) Lib ssh swfp version BL910291
リンクされた実行可能ファイルbos_epb.ppc.elf
に文字列を表示するには、その文字列を含むオブジェクトファイルを選択しlibssh.a
て実行可能ファイルの一部にする必要があります。これにより、上記の問題2が発生します。
そのようなオブジェクトがに存在するという理由だけでlibssh.a
、それが最終的なバイナリにリンクされるとは想定できません。リンカがオブジェクトを最終的な実行可能ファイルに含めるかどうかを決定するために使用するアルゴリズムは、ここまたはここで説明されています。
あなたはできるgarantee全体がいることをlibssh.a
利用して、最終的なバイナリに含まれている-Wl,--whole-archive -lssh -Wl,--no-whole-archive
が、これはある病気-advised。バイナリのリンクに失敗する可能性があり、本来よりも大きくなることが保証されています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加