c-当使用GCC编译时,为什么.o文件似乎有一个大小为0的.bss部分



在编写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以显示符号表。

相关内容

  • 没有找到相关文章

最新更新