2011-11-05 52 views
0

我正在学习有关链接..
我写在C下面的代码的.o和使用gcc符号表条目

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如何让两个'y'?
和.data部分两个'x'是如何区分的?

+0

不知道我以前错过了这个,但是'gcc'命令生成一个可执行文件,而不仅仅是一个名为'begin.o'的目标文件。你真的用'-c'运行它吗? –

+0

它生成一个可执行的对象文件,只需要加载器 – avinash

回答

0

我是一个品级的非专家,但我可以大胆地猜测夫妇:

  1. 既然你只申报z,但从来没有真正使用它,没有需要保持对它的引用。

  2. 尝试添加-Wall,它会告诉您(至少)y已声明但未使用。第一个y实际上只是一个声明,只要您不声明冲突类型,您可以无限期地重复声明。

  3. 在我的编译中,他们最终被命名为x.1281x.1287,所以我猜这就像是C++发生的名称混淆。我猜测1281和1287是一些相关性的偏移,尽管我无法看到任何明显的东西。

+0

@wil ...我找到了答案y部分...实际上初始化变量是强大的,未初始化很弱......如果有一个强大的和同名的弱符号......强烈的被视为定义......我无法弄清楚第一和第三个问题 – avinash