找出函数符号在目标文件 (.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