GCC,什么';“声明可见性的影响”;“违约”;及;“隐藏”;,从objdump的角度

GCC,什么';“声明可见性的影响”;“违约”;及;“隐藏”;,从objdump的角度,gcc,elf,Gcc,Elf,这是一个非常具体的问题。我有两个示例foodd.c文件,如下所示: 首先, #include <stdio.h> __attribute__((visibility("default"))) void FooX(int i); void Foo2(int i) { printf("Via Foo2(%d)\n", i); FooX(i); } #包括 __属性(可见性(“默认”))void FooX(inti); 2(内部一) { printf(“通过Foo2(

这是一个非常具体的问题。我有两个示例
foodd.c
文件,如下所示:

首先,

#include <stdio.h>

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

void Foo2(int i)
{
    printf("Via Foo2(%d)\n", i);
    FooX(i);
}
#包括
__属性(可见性(“默认”))void FooX(inti);
2(内部一)
{
printf(“通过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);
}
#包括
__属性(可见性(“隐藏”))void FooX(int i);
2(内部一)
{
printf(“通过Foo2(%d)\n”,i);
FooX(i);
}
唯一的区别是
FooX
的可见性声明

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

我真的想从可重定位对象的角度了解这个字节的差异的含义。objdump或readelf或任何标准工具都能区分它们吗


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

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

Name          value
STV_DEFAULT   0
STV_INTERNAL  1
STV_HIDDEN    2
STV_PROTECTED 3

添加:您可以转储符号选项卡以检查:

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