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

PHT

概述

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

整体结构

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

PHTELF 文件中的位置

单个 Program Header 的字段(Elf64_Phdr

字段说明

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

  1. p_flags(权限)

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

  1. p_vaddrp_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 中各个 segmentp_offsetp_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. 其他类型的 segmentINTERP/DYNAMIC/NOTE 等)不做 mmap,由动态链接器或运行时按需使用
  3. 另,PHT 描述的是 Segment,不是 .text/.rodata/.data/.bss 这些 Section

SHT

概述

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

SHT 在文件中的位置

单个 Section Header 的字段(Elf64_Shdr

字段说明

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

  1. sh_typesection 类型)

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

  1. sh_addr(虚拟地址)

  1. sh_offsetsh_size(文件位置和大小)

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

  1. sh_addralign(对齐)

  1. sh_entsize(表项大小)

观察 SHT

  1. 文件

  1. 解读

  1. .o 文件的 SHT 对比

SHT 的解析依赖链

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

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

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