readelf -l /bin/bash
给了我这个:
Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040 0x00000000000001f8 0x00000000000001f8 R E 8 INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238 0x000000000000001a 0x000000000000001a R 1 [Requesting program interpreter: /lib/ld-linux-x86-64.so.2] LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000 0x00000000000aeef4 0x00000000000aeef4 R E 200000 LOAD 0x00000000000afde0 0x00000000006afde0 0x00000000006afde0 0x0000000000003cec 0x000000000000d3c8 RW 200000 DYNAMIC 0x00000000000afdf8 0x00000000006afdf8 0x00000000006afdf8 0x0000000000000200 0x0000000000000200 RW 8 NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254 0x0000000000000044 0x0000000000000044 R 4 GNU_EH_FRAME 0x000000000009dbc0 0x000000000049dbc0 0x000000000049dbc0 0x0000000000002bb4 0x0000000000002bb4 R 4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 8 GNU_RELRO 0x00000000000afde0 0x00000000006afde0 0x00000000006afde0 0x0000000000000220 0x0000000000000220 R 1
为什么某些MemSiz
段的FileSiz
不等于LOAD
?对MemSiz
但不包括FileSiz
答案 0 :(得分:5)
有问题的可加载段似乎是程序的数据段。
程序中的数据段包含初始化和 未初始化的程序变量。初始化变量的值是 存储在程序的可执行文件中。未初始化的程序变量没有 需要存放在任何地方;相反,空间是为他们保留的 名为“.bss”的特殊零大小部分。
可执行文件数据段的文件大小因此可以小于 它的内存大小。
举例说明:
/*
* Space for the intialized variable 'x' would be reserved the
* executable's ".data" section, along with its initial value.
*/
int x = 42;
/*
* Space for the uninitialized variable 'y' would be reserved in
* the ".bss" section; no file space would be allocated in the
* executable.
*/
int y;
在类似unix的系统上,数据段的部分映射到 “.bss”部分将在程序加载时填零。