理解孤立部分

主要观点:

  • GNU ld 的输出段布局由链接器脚本决定,包括内部(默认)和外部(用 -T-dT 指定),SECTIONS 命令定义输入段如何映射到输出段。
  • 未明确由 SECTIONS 命令放置的输入段称为“孤儿段”,GNU ld 默认创建输出段来容纳孤儿段并插入合适位置。
  • GNU ld 的孤儿段放置算法在 ld/ldlang.c:lang_place_orphansld/ldelf.c:ldelf_place_orphan 中指定,根据段标志等将孤儿段放置在合适输出段后。
  • lld 实现了 GNU ld 链接器脚本的大部分功能,但行为可能有细微差异,没有内置链接器脚本,孤儿段根据等级排序放置。
  • 介绍了 GNU ld 和 lld 中孤儿段放置的各种特殊情况和规则,如非分配段的放置、相似段的查找、特殊符号的处理等。
  • 强调为提高链接器脚本的可移植性,应明确 PT_LOAD 段的边界,给出了最小链接器脚本示例。
  • GNU ld 2.26 及之后版本可通过 --orphan-handling 选项控制孤儿段的处理方式。

关键信息:

  • GNU ld:默认创建输出段容纳孤儿段,算法根据段标志放置孤儿段,内部链接器脚本对自定义段处理有限。
  • lld:根据等级排序放置孤儿段,有特殊情况如非分配段放置、相似段查找等,没有内置链接器脚本。
  • 可移植性:明确 PT_LOAD 段边界,减少对链接器特定算法的依赖,给出最小链接器脚本示例。
  • 孤儿段处理:GNU ld 可通过选项控制孤儿段处理方式。

重要细节:

  • GNU ld 中孤儿段保存结构 orphan_save 关联段标志和输出段等信息。
  • lld 为输出段分配等级,根据等级和各种条件放置孤儿段,处理特殊情况如非分配段、符号赋值等。
  • 可移植性方面要注意对齐和锚定段等,给出 -no-pie 链接的最小链接器脚本示例。
  • GNU ld 的 --orphan-handling 选项有多种处理孤儿段的方式。
阅读 18
0 条评论