1

コンテキスト:ネットワーク経由で実行可能ファイルを転送するプログラムがあります。この実行可能ファイルは大きすぎるためldd -u bigFoo.so、関連する共有オブジェクトで実行しました。これにより、ギグを占有していた未使用の共有オブジェクトファイルが多数あることが明らかになりました。

質問:foo.ccにコンパイルされてリンクされているC++ ソース コードの一部bigFoo.soと、unused.so(によって明らかにされたldd -u) にリンクされているC++ ソース コードが与えられた場合、 のリンクの原因となるbigFoo.so呼び出しをすばやく特定できるスクリプトまたはシェル コマンドのシーケンスはありますか?foo.ccunused.so

4

1 に答える 1

1

にオプション-Wl,-Mを追加した後、再コンパイルしますCXXFLAGS「 Archive member included... 」を検索します。次の行は、ファイルに含まれているライブラリと、それらを要求した関数を示します。

例:

gcc -std=gnu99  -O0 -Wall -Wextra -Wunused -Wl,-M -c showmmap.c -o showmmap.o
gcc -std=gnu99  -O0 -Wall -Wextra -Wunused -Wl,-M    showmmap.o -o showmmap
Archive member included to satisfy reference by file (symbol)

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
                              /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o (__libc_csu_init)
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(fstat.oS)
                              showmmap.o (fstat)

Discarded input sections
--------8<--snip--->8-----

他のライブラリに引き込まれたものを見つけるために、アーカイブを掘り下げなければなりませんでした。この例では、__libc_csu_initfstatが、他のアーカイブ メンバーを含めるよう要求した関数であることがわかります。

オプションの出力-Wl,-Mはかなり... 膨大です。出力をファイルにパイプするか、less

ここに示したのは、出力の先頭からのほんの一部です。多くのライブラリ ルーチンが含まれている可能性があることを考えると、出力は長くなるはずです。

于 2014-07-16T07:55:38.207 に答える