1

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

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

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

4

1 回答 1

2

区别应该在符号表中。符号的可见性由符号表条目的 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

添加:您可以转储符号表以检查:

    readelf -x .symtab foo-hidden.o
    objdump -t foo-hidden.o
于 2013-10-11T05:30:36.467 回答