• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2026-05-21 10:50 Aet |  隐藏边栏 |   抢沙发 |  19 
文章评分 1 次,平均分 5.0 :

PHT

概述

  1. Program Header Table 是 ELF 文件中给加载器(loader)看的部分
  2. Program Header Table 描述"加载器视角"——文件应该怎么映射到内存中执行

整体结构

  1. PHT 是一个数组,每个元素叫 Program Header(也叫 Segment Header)
  2. 每个 Program Header 描述一个段(Segment),告诉加载器一段连续的内存区域应该如何创建

PHT 在 ELF 文件中的位置

单个 Program Header 的字段(Elf64_Phdr)

字段说明

  1. p_type(段类型)
    1. 最关键的字段,告诉加载器"这是什么样的段,怎么处理"

  1. p_flags(权限)

  1. p_offset 和 p_filesz(文件中的位置和大小)

  1. p_vaddr 和 p_memsz(内存中的位置和大小)

  1. p_paddr(物理地址)

  1. p_align(对齐要求)

  1. 示例

Section to Segment 的映射

  1. PHT 不是从零创建的——每个 Segment 是由若干个 Section 组合而成的

加载器是怎么用 PHT 的

SHT VS PHT

简单的内存观察

关于pht的理解

  1. 链接完成时:
    1. ELF 文件中所有字节的布局是固定的
    2. 各个 section(.text/.rodata/.data 等)在文件中的偏移是固定的
    3. PHT 中各个 segment 的 p_offset 和 p_vaddr 也是固定的
  2. 加载时:
    1. 加载器读 PHT,不看 Section Header Table
    2. 对每个 PT_LOAD segment,用 mmap 把文件的 [p_offset, p_offset+p_filesz) 映射到虚拟地址 [p_vaddr, p_vaddr+p_filesz),权限按 p_flags
    3. 如果 p_memsz > p_filesz(有 .bss),多出部分用匿名零页填充
    4. 其他类型的 segment(INTERP/DYNAMIC/NOTE 等)不做 mmap,由动态链接器或运行时按需使用
  3. 另,PHT 描述的是 Segment,不是 .text/.rodata/.data/.bss 这些 Section

SHT

概述

  1. Section Header Table 描述"链接器视角"——文件由哪些 section 组成
  2. Section Header Table(SHT)是 ELF 文件的"目录"——它告诉链接器、调试器和各种工具,这个文件由哪些部分组成、每个部分是什么、在哪里

SHT 在文件中的位置

单个 Section Header 的字段(Elf64_Shdr)

字段说明

  1. sh_name
    1. sh_name 不是字符串,而是一个整数偏移

  1. sh_type(section 类型)

  1. sh_flags(section 属性)
    1. 注意 SHF_ALLOC 这个标志——它决定了 section 是否会被加载到内存
    2. .text/.data/.rodata/.bss 有这个标志(运行时需要),而 .symtab/.debug_*/.comment 没有(只在文件中,运行时用不到)
    3. strip 去掉的就是那些没有 ALLOC 标志的 section

  1. sh_addr(虚拟地址)

  1. sh_offset 和 sh_size(文件位置和大小)

  1. sh_link 和 sh_info(关联信息)
    1. 这两个字段的含义随 sh_type 变化,是 SHT 中最灵活也最容易混淆的部分:

  1. sh_addralign(对齐)

  1. sh_entsize(表项大小)

观察 SHT

  1. 文件

  1. 解读

  1. .o 文件的 SHT 对比

SHT 的解析依赖链

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2026-06-26
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享
繁