在 C 语言程序中,变量的外部声明导致在 ELF 中的大小为 0。当已知实际大小时,为什么不将其存储在 ELF 中?对于像不完整数组这样的情况,我理解没有大小信息,但对于其他情况,应该可以存储大小。
我尝试了一些简单代码,并验证了在 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进行链接时,链接器实际上可以检测到由于大小而导致的潜在不匹配。
那么为什么不发出大小以帮助捕捉这类微妙问题呢?
long long
和double
通常具有相同的大小,即 8。大小检查无法捕获将extern long long x
定义为double x
的情况。 - Kaz