主要观点:
- GNU ld 的输出段布局由链接器脚本决定,包括内部(默认)和外部(用
-T
或-dT
指定),SECTIONS
命令定义输入段如何映射到输出段。 - 未明确由
SECTIONS
命令放置的输入段称为“孤儿段”,GNU ld 默认创建输出段来容纳孤儿段并插入合适位置。 - GNU ld 的孤儿段放置算法在
ld/ldlang.c:lang_place_orphans
和ld/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
选项有多种处理孤儿段的方式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。