You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

目标文件/可执行文件中Segment与Section的区别是什么?

搞懂目标文件里的Segment和Section:核心区别一目了然

刚接触二进制文件格式(比如ELF、PE)的时候,我也被这俩术语绕得头大——一会儿section一会儿segment,看起来都是指文件里的“块”,到底差在哪?其实核心是两者的设计目标和服务对象完全不同,拆开来讲就清楚了:

一、Section:编译/链接阶段的“逻辑单元”

  • 是编译器、汇编器、链接器打交道的最小逻辑单元,每个section都有明确的用途:比如.text存可执行代码,.data存已初始化的全局变量,.bss存未初始化的全局变量,.rodata存字符串常量这类只读数据。
  • 它的作用是帮工具链分类管理代码和数据:链接器会把所有目标文件里同类型的section合并(比如把所有.text合并成最终的代码块),还能通过section设置某些代码/数据的属性(比如用.gnu.linkonce标记只保留一份的代码)。
  • 你可以用工具查看:比如ELF文件用readelf -S,PE文件用dumpbin /sections,能看到一堆细分的section列表。

二、Segment:操作系统加载阶段的“内存映射单元”

  • 是给操作系统加载程序用的“大打包单元”,它把属性相同的多个section打包在一起,让OS可以一次性映射到内存并设置统一的权限。
  • 举个ELF的例子:一个LOAD类型的代码segment会包含.text(可执行)和.rodata(只读)这两个section,OS加载时会把这个segment映射到内存,设置权限为只读+可执行(rx);而数据segment会包含.data和.bss,映射后权限是可读可写(rw)。
  • 它的核心是适配OS的内存管理:OS不需要关心文件里细分的section,只需要按segment分配内存、设置权限,效率更高。查看工具比如ELF用readelf -l,PE用dumpbin /headers看内存映射信息。

三、不同格式里的术语差异(比如PE文件)

你提到的Windows PE格式(.exe/.dll)术语体系有点特殊:

  • PE文件里的“Section”其实更接近ELF里的section,是文件中的逻辑单元(比如.text、.data);
  • 当PE文件加载到内存后,这些Section会被映射到对应的内存区域,有时候也会被称为“segment”,但PE的官方文档里更多用“Section”来统一指代文件和内存中的单元,只是加载后的Section会对应到内存的一个“Page Region”(本质就是segment的作用)。

一句话总结

Section是给编译工具用的“逻辑分类标签”,Segment是给操作系统用的“内存打包单元”——一个Segment可以装多个同属性的Section,而一个Section只会属于一个Segment。

内容的提问来源于stack exchange,提问作者Dean Leitersdorf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:58:59