作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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
为什么对于某些 LOAD
段,MemSiz
不等于 FileSiz
?对于 MemSiz
而不是 FileSiz
包含的内存区域应该做什么?
最佳答案
有问题的可加载段似乎是程序的数据段。
程序中的数据段包含用于初始化和未初始化的程序变量。初始化变量的值是存储在程序的可执行文件中。未初始化的程序变量不需要存放在任何地方;相反,空间是为他们保留的名为“.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”部分将在程序加载时用零填充。
关于linux - ELF 程序头 : MemSiz vs. FileSiz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437732/
readelf -l/bin/bash 给我这个: Program Headers: Type Offset VirtAddr Phy
我是一名优秀的程序员,十分优秀!