2017-03-17 54 views
1

我只關心默認/隱藏的可見性。
.o文件未與IPO一起編譯。在目標文件中找出函數符號的可見性(.o)

如何在.o文件中查找符號的可見性?

爲什麼我必須從.o文件中找到它:
在某個平臺上,我遇到了gcov.a,這看起來有問題。
我必須弄清楚它錯在哪裏。
1.我不知道工具鏈的配置和構建方式。
2.作爲libgcc魔術的一部分,從源代碼中找出它非常困難。

+0

您是否試過'nm'命令? – codeforester

回答

1

通過檢查 文件的符號表與objdump -t,可以找出目標文件中符號的可見性。如果符號爲hidden,則其 將在其objdump記錄的第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概念映射回其簡化的世界觀時,它會直截了當地說謊。 –