0

私はリンクについて学んでいます..
私はcで次のコードを書き、gccを使用して.oを作成しました

int f()
{
static int x=0;
return x;
}

extern int z;

int g()
{
static int x=10;
return x;
}

static int y;
static int y=9;

int main()
{
return 0;
}

次に、これを .o にしました:
gcc begin.c -o begin.o

今、readelf を使用して symtab をチェックしたところ、z の記録がありませんでした....なぜですか?
また、gcc はどのようにして 2 つの 'y' を許可しますか?
.data セクションでは、2 つの「x」はどのように区別されますか?

4

1 に答える 1

0

私は専門家ではありませんが、いくつかの推測を危険にさらす可能性があります。

  1. 宣言するだけでz実際に使用することはないため、参照を維持する必要はありません。

  2. を追加してみてください。これにより、宣言されているが使用されていない-Wallことが (少なくとも)わかります。y1 つ目yは実際には単なる宣言であり、競合する型を宣言しない限り、無限に繰り返すことができます。

  3. 私のコンパイルでは、それらは最終的に and という名前x.1281x.1287なるので、C++ で発生する名前マングリングのようなものだと思います。私が推測する 1281 と 1287 は、何らかの関連性のオフセットですが、明らかなものは何もわかりません。

于 2011-11-05T06:26:57.040 に答える