ここで非常に具体的な質問です。次のような 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 バイトしか違わないことがわかります。
リロケータブルオブジェクトの観点から、このバイトの違いの意味を知りたいです。objdump や readelf など、標準的なツールでそれらの違いを判別できますか?
私の実験環境はopenSUSE Linux 11.4、gcc 4.5.1です。