C程序中变量的外部声明会导致ELF中的大小为0。在已知的情况下,为什么实际大小不存储在ELF中?对于像不完整数组这样的情况,我知道没有大小信息,但对于其他情况,应该可以存储大小。
我尝试了一些简单的代码,并在ELF中验证发出的大小为零。
// file1.c
extern int var;
int main()
{
var = 2;
}
// file 2.c
long long int var = 8;
gcc -c file1.c
readelf -s file1.o
...
9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND var
...
gcc -c file2.c
readelf -s file2.o
...
7: 0000000000000000 8 OBJECT GLOBAL DEFAULT 2 var
...
如果在file1.o中var的大小存储为4,则当与file2.o链接时,链接器实际上可以检测到由于大小而导致的潜在不匹配。
那么,为什么不发出size,因为它可以帮助捕获一些像这样的微妙问题?
发布于 2019-06-06 11:59:41
在file1
中,var
只是一个占位符。它不会占用任何内存。外部标识符用于向编译器和链接器指示变量var
存储在别处。
按照您的建议,为单变量var
提供两个存储位置是错误的。
C语言的一个怪癖是,您可以为外部变量定义不同的类型,为底层全局变量定义不同的类型,就像您在示例中所做的那样。这是我们拥有静态分析工具的原因之一。
https://stackoverflow.com/questions/56470654
复制相似问题