海湾合作委员会,从objdump的角度来看,宣布“默认”和“隐藏”的可见性有什么影响

时间:2013-10-11 03:16:12

标签: gcc elf

这是一个非常具体的问题。我有两个样本foo2d.c这样的文件:

首先,

#include <stdio.h>

__attribute__((visibility("default"))) void FooX(int i);

void Foo2(int i)
{
    printf("Via Foo2(%d)\n", i);
    FooX(i);
}

其次,

#include <stdio.h>

__attribute__((visibility("hidden"))) void FooX(int i);

void Foo2(int i)
{
    printf("Via Foo2(%d)\n", i);
    FooX(i);
}

唯一的区别是FooX的可见性声明。

鉴于两个文件名相同并编译两次(gcc -c foo2d.c),我得到两个.o文件,并将它们分别重命名为foo-default.ofoo-hidden.o。我比较了两个.o文件,发现它们只相差一个字节。

Beyond Compare showing the diff

我真的想知道从可重定位对象的角度来看这个字节差异的含义。 objdump或readelf,或任何标准工具可以说明它们的区别吗?

我的实验环境是openSUSE Linux 11.4,gcc 4.5.1。

1 个答案:

答案 0 :(得分:2)

差异应该在符号表中。符号的可见性由symtab条目的st_other字段确定。它说:

Name          value
STV_DEFAULT   0
STV_INTERNAL  1
STV_HIDDEN    2
STV_PROTECTED 3

请参阅http://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblj/index.html#chapter7-27

添加:您可以转储symtab以进行检查:

    readelf -x .symtab foo-hidden.o
    objdump -t foo-hidden.o