找出函数符号在目标文件 (.o) 中的可见性
Find out a function symbol's visibility in an object file (.o)
我只关心 default/hidden 可见度。
.o 文件不是用 IPO 编译的。
如何找出符号在.o 文件中的可见性?
为什么我必须从 .o 文件中找到它:
在某些平台上,我 运行 变成了 gcov.a,这似乎有问题。
而且我得弄清楚哪里错了。
1. 我不知道工具链是如何配置和构建的。
2. 作为libgcc魔法的一部分,从源代码中弄清楚它是极其困难的。
您可以通过检查来找出对象文件中符号的可见性
文件的符号 table 和 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
我只关心 default/hidden 可见度。
.o 文件不是用 IPO 编译的。
如何找出符号在.o 文件中的可见性?
为什么我必须从 .o 文件中找到它:
在某些平台上,我 运行 变成了 gcov.a,这似乎有问题。
而且我得弄清楚哪里错了。
1. 我不知道工具链是如何配置和构建的。
2. 作为libgcc魔法的一部分,从源代码中弄清楚它是极其困难的。
您可以通过检查来找出对象文件中符号的可见性
文件的符号 table 和 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