我只關心默認/隱藏的可見性。
.o文件未與IPO一起編譯。在目標文件中找出函數符號的可見性(.o)
如何在.o文件中查找符號的可見性?
爲什麼我必須從.o文件中找到它:
在某個平臺上,我遇到了gcov.a,這看起來有問題。
我必須弄清楚它錯在哪裏。
1.我不知道工具鏈的配置和構建方式。
2.作爲libgcc魔術的一部分,從源代碼中找出它非常困難。
我只關心默認/隱藏的可見性。
.o文件未與IPO一起編譯。在目標文件中找出函數符號的可見性(.o)
如何在.o文件中查找符號的可見性?
爲什麼我必須從.o文件中找到它:
在某個平臺上,我遇到了gcov.a,這看起來有問題。
我必須弄清楚它錯在哪裏。
1.我不知道工具鏈的配置和構建方式。
2.作爲libgcc魔術的一部分,從源代碼中找出它非常困難。
通過檢查 文件的符號表與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
通常,在ELF系統上使用objdump來做任何事情都是一個錯誤:使用'readelf'代替。 'objdump'來自'COFF'時代,它的世界模型已經嚴重過時,並且在將非平凡的ELF概念映射回其簡化的世界觀時,它會直截了當地說謊。 –
您是否試過'nm'命令? – codeforester