2017-03-17 10 views
1

私はデフォルト/非表示の可視性のみを気にします。
.oファイルはIPOでコンパイルされません。オブジェクトファイル(.o)で関数シンボルの可視性を調べる

.oファイルでシンボルの表示を調べるにはどうすればよいですか?

なぜ私は.oファイルからそれを見つけなければならないのですか:
特定のプラットフォームでは、問題が発生したgcov.aが発生しました。
どこが間違っているか把握しなければなりません。
1.ツールチェーンがどのように正確に構成され、構築されているかわかりません。
2. libgccマジックの一環として、ソースコードからそれを理解することは非常に困難です。

+0

'nm'コマンドを試しましたか? – codeforester

答えて

1

objdump -tというファイルのシンボルテーブル を調べることによって、オブジェクトファイル内のシンボルの可視性を確認できます。シンボルがhiddenの場合、そのレコードの6番目のフィールドに.hiddenというラベルが付けられ、 の名前が続きます。その可視性がdefaultであれば、そのようなラベルはなく、 第6フィールドが名前(通常の場合)になります。たとえば、次のように

foo.cの(デフォルトの可視性)

#include <stdio.h> 

void foo(void) 
{ 
    puts("foo"); 
} 

コンパイルおよび調べる:

$ gcc -c -fPIC foo.c 
$ objdump -t foo.o | grep foo 
foo.o:  file format elf64-x86-64 
0000000000000000 l df *ABS* 0000000000000000 foo.c 
0000000000000000 g  F .text 0000000000000013 foo 

のfoo.c(隠された可視性)

#include <stdio.h> 

__attribute__ ((visibility ("hidden"))) void foo(void) 
{ 
    puts("foo"); 
} 

を再コンパイルして再調査する:

$ gcc -c -fPIC foo.c 
$ objdump -t foo.o | grep foo 
foo.o:  file format elf64-x86-64 
0000000000000000 l df *ABS* 0000000000000000 foo.c 
0000000000000000 g  F .text 0000000000000013 .hidden foo 
+1

一般に、ELFシステム上のものに 'objdump'を使用するのは間違いです。代わりに' readelf'を使います。 'objdump'は' COFF'日からのものであり、世界のモデルは時代遅れです。単純ではないELFの概念を単純化した世界観に戻すと、それはあなたに嘘をつきます。 –