File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ +++
2+ date = ' 2025-11-19T15:54:44+08:00'
3+ draft = true
4+ title = ' Csapp'
5+ +++
6+
7+ ## ELF 的分布
8+
9+ - 段头部表:指示下面的各种段是如何加载进入内存的。(头)
10+ - 节头部表:指示如何让动态链接的程序如何去加载共享库。(末尾)
11+
12+
13+ ` ELF ` 中有一部分只读的,还有读写的部分。
14+
15+ 只读:
16+
17+ - ` .init ` : 在程序运行前设置运行环境的代码部分。
18+ - ` .text ` : 编译后的机器码。
19+ - ` .rodata ` : 常量区,比如 ` C-Style ` 的字符串。
20+
21+ 读写:
22+
23+ - ` .data ` : 存储已初始化的全局变量、静态变量。
24+ - ` .bss ` : 可以认为是 ` Better Save Storage ` ,因为放在此处可以减少 ` ELF ` 的体积。
25+
26+ ---
27+
28+ > 使用 ` readelf ` ,会发现这些段的加载到 ` 2MB ` 的整数倍上,是为了内存对齐。
29+ > 在 ` ELF ` 段头表上面,会看到 ` vaddr ` 和 ` paddr ` ,一般只考虑前者。
30+
31+ 在现代操作系统上面,使用 ` PIE ` (非位置无关可执行文件),所以看到的是4K页的映射,已经没有物理地址的说明了。这样让加载器自动确定地址。
32+
33+ 在读写的部分,会发现文件大小和加载后的内存大小不一致,因为 ` bss ` 段不会加载进去,而是预留八字节。
34+
35+ ## 加载可执行目标文件
36+
37+ ![ 内存布局图] ( image.png )
38+
39+ 一个相比微机原理更加详细的内存布局图。
40+
41+ 在64位系统上面, ` 2^48 ` 以上的部分保留给内核,` 2^48-1 ` 部分是栈,向低地址增长,共享库位于堆和栈的中间。
42+
43+ ## PIC (位置无关代码)
44+
45+ 通过 ` PIC ` ,可以实现不同的程序共用加载在同一段在内存中的共享库,从而节省空间。
46+
47+ 在数据段开始的部分,添加一个 ` GOT ` 全局偏移表,这个表可以被动态链接器查找对应的共享库内存地址,从而使用共享库。
You can’t perform that action at this time.
0 commit comments