您还没有发布实际的 objdump 输出(为什么?),所以我只是猜测,但这可能是因为该.bss部分。
.bss包含程序启动时未显式初始化的所有静态或全局变量。因为它们没有初始值,所以二进制文件不需要包含任何实际值。该部分只是作为占位符。它将有元数据(大小、位置、符号偏移),但没有实际数据。
当您将程序加载到内存中以运行它时,实际上不需要从文件中加载任何内容,但是 ELF 加载器会在正确的位置保留适当数量的内存,而程序的工作就是归零-初始化该内存(通常crt1.o代码会这样做)。
这是一个例子:
objdump -x /bin/bash
....
Idx Name Size VMA LMA File off Algn
....
24 .data 00008360 00000000006db620 00000000006db620 000db620 2**5
CONTENTS, ALLOC, LOAD, DATA
25 .bss 00005a48 00000000006e3980 00000000006e3980 000e3980 2**5
ALLOC
26 .gnu_debuglink 0000000c 0000000000000000 0000000000000000 000e3980 2**0
CONTENTS, READONLY
这里有三种不同的部分:
.dataCONTENTS是设置了,ALLOC和LOAD标志的“正常”部分。
.bss没有要存储或加载的真实数据,所以它只有ALLOC.
.gnu_debuglink根本不适合正在运行的程序;它没有设置VMA或LMA设置,也没有设置ALLOC或LOAD标志,尽管它确实有真实的CONTENTS(用于链接/调试目的)