您还没有发布实际的 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
这里有三种不同的部分:
.data
CONTENTS
是设置了,ALLOC
和LOAD
标志的“正常”部分。
.bss
没有要存储或加载的真实数据,所以它只有ALLOC
.
.gnu_debuglink
根本不适合正在运行的程序;它没有设置VMA
或LMA
设置,也没有设置ALLOC
或LOAD
标志,尽管它确实有真实的CONTENTS
(用于链接/调试目的)