5

次の問題を体系的にデバッグしようとしています。

% gcc -fPIC -flto -o try1.o -c try1.c
% gcc -fPIC -flto -o try2.o -c try2.c
% gcc -shared -flto -fPIC -o try.so try1.o try2.o
try2.c:1:14: warning: type of 'aaaaaaaa' does not match original declaration [enabled by default]
try1.c:1:5: note: previously declared here

私はこの模擬テストで、何が問題なのかを正確に知っています -ここでaaaaaaaa定義されていますが、そこにあります。私の実際の問題では、リンケージは複雑なビルド プロセスの結果である多くのオブジェクトを結合します。どの 2 つのオブジェクトに競合する定義が含まれているかわかりません。intshort

リンクされた各オブジェクト ファイルを調べて、それぞれでシンボルがどのように定義されているかを確認し、定義が一致しないペアを見つけて、この問題に取り組みたいと考えています。次に、ビルド プロセスを追跡して、それらがどのようにビルドされているかを確認し、根本原因を突き止めます。しかし、オブジェクトがどのように定義されているかを確認する方法がわかりません。

nm -Aとを試しobjdump -tましたが、シンボルのタイプ/サイズが表示されません:

% nm -A try1.o
try1.o:00000001 C __gnu_lto_v1
try1.o:00000000 D aaaaaaaa
% nm -A try2.o
try2.o:00000001 C __gnu_lto_v1
try2.o:         U aaaaaaaa
try2.o:00000000 T foo
% objdump -t try1.o | grep aaa
00000000 g     O .data  00000004 aaaaaaaa
% objdump -t try2.o | grep aaa
00000000         *UND*  00000000 aaaaaaaa

私のコンパイラ:

% gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4

1 に答える 1

2

を使用しnm --print-sizeます。GNUnmのデフォルトは BSD 形式で、値のみが表示されます。この情報はリンクには必要なく、どこにも保存されないため、未定義のシンボルのサイズは表示されません。

でコンパイルすると-flto、GCC はいくつかの.gnu.lto_.セクションを追加します。これらのセクションには、特に未定義シンボルの予想サイズが含まれます。それらを解析するためのすぐに利用できるツールがあるかどうかはわかりません。

次のコマンドで 16 進ダンプを表示できます。

F=try2.o; objdump -h $F | grep -o '\.gnu.lto_\S*' | xargs -I% readelf -x % $F
于 2016-08-11T12:06:37.863 に答える