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