这里有一个非常具体的问题。我有两个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。