我正在学习链接..
我在c中编写了以下代码,并使用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 by:
gcc begin.c -o begin.o
现在当我使用readelf检查symtab时,没有z的记录....为什么?
gcc如何允许两个'y'?
在.data部分中,两个'x'是如何区分的?
答案 0 :(得分:0)
我是一名非专家,但我可能会冒一些猜测:
由于您只声明z
但从未实际使用过,因此无需维护对它的引用。
尝试添加-Wall
,它会告诉您(至少)y
已声明但未使用。第一个y
实际上只是一个声明,只要您不声明冲突类型,就可以无限期重复。</ p>
在我的编译中,它们最终被命名为x.1281
和x.1287
,所以我猜它类似于C ++中发生的名称错误。 1281和1287我猜是有些相关的偏移,虽然我看不到任何明显的东西。