在编写C程序时,我修改了构建,生成了一个.o文件,而不是一个独立的二进制文件。在执行此操作时,我注意到根据readelf -S
,生成的.o文件的.bss部分的大小为0,尽管源文件中显然存在未初始化的全局变量。
我可以用一个简单的程序来复制它,test.c:
char arr[42];
int main(int argc, char **argv){
return 0;
}
根据readelf的说法,gcc -o test test.c
产生的二进制文件有一个80字节的.bss部分,这大致是我所期望的,因为我预计会有一些小开销。
但是,如果我使用gcc -c -o test.o test.c
构建了一个.o文件,则bss部分的大小报告为零。很明显,我对ELF对象文件的性质有些误解,但我不太确定我遗漏了什么。
ELF对象文件有一个伪.bss段。它们不能直接加载(与可执行文件或共享库不同(。
有关全局变量的信息存储在.symtab部分中,链接器使用该部分来构造最终二进制文件中的.bss和其他部分。
尝试执行readelf -s test.o
以显示符号表。