GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

应用安全 --- 应知应会 之 ELF文件节区

ELF 常见节区及其作用

节区名称 (Section Name)作用简介通俗易懂的举例
.text 代码段。存储程序的所有可执行指令(编译后的机器代码)。 就像一本烹饪书的操作步骤部分(“第一步:打蛋;第二步:搅拌...”)。
.data 已初始化数据段。存储已初始化的全局变量和静态变量。 就像准备好了的预制食材(一碗已经量好的 100 克糖,一瓶已开封的牛奶)。
.bss 未初始化数据段。存储未初始化的全局变量和静态变量,程序加载时系统会自动将它们初始化为零。 就像预先留出的空碗和空盘子(你知道需要它们,但使用前才会清洗干净并放入东西)。
.rodata 只读数据段。存储常量和只读数据,如字符串字面量。 就像刻在石板上的固定食谱名称(“提拉米苏配方”)或警示语(“小心烫伤!”),无法修改。
.strtab 字符串表。存储各种符号名称的字符串(如变量名、函数名)。 就像一份名称索引,记录了所有食材和工具的标准名称(“鸡蛋”、“电动搅拌器”)。
.symtab 符号表。存储程序中定义的以及引用的符号信息(函数、变量),包括它们的名字、位置等。 就像一份全局地图,标注了所有厨房工具的位置(“打蛋器放在左上角第二个抽屉”)和外部商店的位置。
.shstrtab 节区名称字符串表。存储所有节区名称的字符串(如 .text.data 这些名字本身)。 就像一本书的目录页的标题(“第一章”、“附录”),它本身也是书的一部分。
.plt 过程链接表。用于动态链接,是调用共享库(如 libc.so)中函数的跳板。 就像餐厅的前台电话。你想点外卖(调用外部函数),先打电话给前台(.plt),前台帮你去联系。
.got / .got.plt 全局偏移表。也用于动态链接,存储外部函数和变量的实际地址。.plt 通过查这张表来跳转。 就像前台的外卖电话速拨表。前台(.plt)接到你的电话后,查这个表(.got.plt)找到披萨店的真正电话号码并进行拨打。
.dynamic 动态信息段。存储了动态链接器所需的各种信息,如依赖哪些共享库、符号表地址等。 就像一份动态链接说明书,告诉系统这个程序需要哪些外部组件(面粉、鸡蛋供应商)以及如何找到它们。
.init 初始化代码段。存储程序初始化时自动执行的代码(在 main 函数之前)。 就像做菜前预热烤箱的自动程序,不需要你手动操作,但必须执行。
.fini 终止代码段。存储程序结束时自动执行的代码(在 main 函数之后)。 就像做完菜后自动关闭烤箱并发出提示音的程序。
.init_array / .fini_array 构造函数数组 / 析构函数数组。存储一系列在 main 之前/之后执行的函数指针(C++ 全局对象构造/析构)。 就像一份在开餐前必须按顺序完成的准备工作清单(“1. 铺桌布,2. 摆餐具...”)和餐后清理工作清单(“1. 洗碗,2. 擦桌子...”)。
.rel.dyn / .rel.plt 重定位表。包含需要被链接器修改(重定位)的地址信息,用于修正代码和数据中的绝对地址。 就像一份地址更新清单。你搬家后(程序被加载到新地址),邮局(链接器)根据这个清单更新所有寄往你旧地址的信件(指令中的地址)上的地址标签。
.eh_frame / .eh_frame_hdr 异常处理帧信息。存储如何展开调用栈的信息,用于 C++ 异常处理和调试。 就像火灾时的紧急疏散图,清晰地标明了安全出口和逃生路线(如何从当前函数一步步返回到上级函数)。
.gcc_except_table GCC 异常表。与 .eh_frame 配合,定义了哪些代码区域处理哪些类型的异常。 就像疏散图上标注的不同灾害类型(火、地震)对应的不同逃生方案。
.comment 注释信息段。存储编译器的版本信息等注释内容。 就像书中的版权页,写着“本书由 XXX 出版社于 YYYY 年出版”。
.debug_* 调试信息段(如 .debug_info.debug_line)。存储丰富的调试信息,只有调试版本的程序才有。 就像一份极其详细的厨师工作日志,记录了每一步操作的原因、用时、甚至当时的心情(仅供调试使用,会显著增大文件体积)。

总结一下记忆技巧:

  • 执行:看 .text

  • 数据:

    • 有值的→ .data

    • 没值的 → .bss

    • 不能改的 → .rodata

  • 导入的函数:.plt (打电话) + .got (查号码)

  • 辅助信息:

    • 起名字用的 → .strtab.symtab

    • 定规矩用的 → .dynamic

    • 处理异常的 → .eh_frame

    • 初始化收尾 → .init.fini.init_array

posted on 2025-08-31 18:08  GKLBB  阅读(24)  评论(0)    收藏  举报