1

ここで非常に具体的な質問です。次のような 2 つのサンプルfoo2d.cファイルがあります。

初め、

#include <stdio.h>

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

void Foo2(int i)
{
    printf("Via Foo2(%d)\n", i);
    FooX(i);
}

2番、

#include <stdio.h>

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

void Foo2(int i)
{
    printf("Via Foo2(%d)\n", i);
    FooX(i);
}

唯一の違いは、の可視性宣言ですFooX

2 つのファイルに同じ名前を付けて 2 回コンパイルすると ( gcc -c foo2d.c)、2 つの .o ファイルが得られ、それらの名前をそれぞれ および に変更しfoo-default.oますfoo-hidden.o。2 つの .o ファイルを比較すると、1 バイトしか違わないことがわかります。

差分を示すBeyond Compare

リロケータブルオブジェクトの観点から、このバイトの違いの意味を知りたいです。objdump や readelf など、標準的なツールでそれらの違いを判別できますか?

私の実験環境はopenSUSE Linux 11.4、gcc 4.5.1です。

4

1 に答える 1

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
于 2013-10-11T05:30:36.467 に答える