c - 为什么 ELF 中外部变量的大小为 0?

标签 c linker elf

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
...

如果 var 的大小在 file1.o 中存储为 4,链接器实际上可以在与 file2.o 链接时检测到由于大小导致的潜在不匹配。

那么,为什么不发出尺寸,因为它可以帮助捕捉像这样的一些细微问题?

最佳答案

file1中,var只是一个占位符。它不会占用任何内存。外部标识符是为了向编译器和链接器指示变量 var 存储在别处。

按照您的建议,为单个变量 var 设置两个存储位置是错误的。

这是 C 语言的一个怪癖,您可以为外部变量定义不同的类型,为基础全局变量定义不同的类型,就像您在示例中所做的那样。这是我们拥有静态分析工具的原因之一。

关于c - 为什么 ELF 中外部变量的大小为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56470654/

相关文章:

Golang : multiple definition of CGO ported package

c - ld 在链接动态共享库时做什么?

c++ - ELF 文件中的 resolve 函数如何知道符号在哪些库中?

Linux ELF - 为什么正常链接运行速度比 'ldd -r' 更快?

C malloc() 与结构建议

c - Linux 上使用 ioctl 进行被动 wifi 扫描

c - 如何在 gdb 中 fork() ed 的不同进程之间切换?

c++ - Mergevec.obj : 10 unresolved linking errors (OpenCV samples collection for haartraining)

linux - readelf -s 不输出完整的变量名

c - 如何计算给定微 Controller 单元的机器周期时间