这是一个非常具体的问题。我有两个样本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.o
和foo-hidden.o
。我比较了两个.o文件,发现它们只相差一个字节。
我真的想知道从可重定位对象的角度来看这个字节差异的含义。 objdump或readelf,或任何标准工具可以说明它们的区别吗?
我的实验环境是openSUSE Linux 11.4,gcc 4.5.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