ELD:面向嵌入式系统的新型开源嵌入式链接器工具
[正文内容]
ELD:为嵌入式系统引入一种新的开源嵌入式链接器工具
作者: Shankar Kalpathi Easwaran 2025年4月10日
注册开发者月度新闻邮件
加入全球数千名开发者的行列,通过我们每月精心策划的新闻邮件接收最新的新闻和更新。
注册
寻求支持,留在社区
获得专家的支持,与志同道合的开发者联系,并参与专属的虚拟活动。
加入开发者 Discord
在 Qualcomm Technologies, Inc.,嵌入式链接器在我们的软件栈中扮演着至关重要的角色。虽然许多链接器在传统平台上运行良好,但在嵌入式系统方面往往有所欠缺。
嵌入式项目有其独特的需求,例如:
- 严重依赖链接器脚本,这通常不是主机链接所关注的。
- 复杂的使用场景通常需要定制链接器功能或链接器脚本的扩展,以满足特定的客户需求。
为了应对这些挑战,我们开发了一个名为 eld 的链接器,它源自 mclinker。该链接器旨在与 ELF 文件配合使用,并专门为满足嵌入式社区的需求而定制。
eld
链接器包含在 Qualcomm 编译器工具链中,并尽可能利用 LLVM 组件和库。我们的客户依靠 eld
构建在 Qualcomm Technologies 硬件上运行的镜像。
我们很高兴能开源 eld
链接器!我们的目标是与链接器和系统软件社区合作,开发新功能并增强其能力。从 GitHub 下载 eld
功能
该链接器完全符合 GNU 标准,包括读取输入文件、符号解析和生成符合 GNU 标准的输出。
该链接器支持以下目标平台:
- AArch32 和 AArch64
- Qualcomm Hexagon NPU
- RISC-V (包括 Xqiu 扩展)
该链接器包含 GNU 兼容链接器中常用的各种功能,包括:
- 部分链接
- 动态链接
- 静态链接
- 链接时优化 (LTO)
- 链接器优化,例如字符串合并
此外,该链接器还对带有自定义扩展的链接器脚本提供成熟的支持。
扩展功能
该链接器还包含许多旨在增强用户体验的功能,例如:
- 易于阅读的链接器映射文件:我们的客户支持团队广泛使用此信息来诊断和解决问题。这些映射文件也是机器可读的,使客户能够从他们构建的镜像中生成自定义报告。
- 轻松重现链接时问题:客户在遇到链接时问题时,可以分享链接时使用的工件的一种独特方法。
- 全面的诊断选项:为复杂问题(如符号垃圾收集、命令行问题、警告和错误)提供广泛的调试功能。
链接器插件
为了响应客户对检查和更改镜像布局、扩展链接器功能以用于意外用例以及生成自定义报告的需求不断增长,我们开发了链接器插件。
这些插件允许客户创建在链接时运行的自定义 Pass,从而提供完全的用户控制和链接器管理,并侧重于诊断。
该插件基础设施还允许工具链开发人员将链接器视为透明组件,从而促进对镜像中假设的仔细管理,如果违反假设,则发出错误或警告,并在源代码中编码信息以供链接器使用。
此基础设施还有助于编译器开发人员做出布局决策,使他们能够:
- 将辅助信息从编译器传递到链接器
- 针对特定用例优化镜像布局
Qualcomm Technologies 产品对链接器的使用
该链接器已应用于各种 Qualcomm Technologies 的产品中,包括:
- Qualcomm AI 软件基础设施
- Qualcomm 5G 调制解调器
- 无线 LAN 产品和驱动程序
- Qualcomm 固件和设备驱动程序
- Qualcomm 音频驱动程序
- TrustZone
- 许多使用 Zephyr RTOS 的 AArch32/AArch64/RISC-V 镜像
- 各种基于 RISC-V 的微控制器镜像
链接器源代码组织
链接器源代码分为三个主要部分:
- 核心链接器(分为功能特定的目录)
- 特定于目标的覆盖
- 单元测试
核心链接器包含最关键的功能,而特定于目标的覆盖则有助于自定义核心链接器提供的功能。
这种封装允许开发人员修改和增强特定于目标的功能,而不会影响其他目标。
单元测试分为两类:
- 使用 Google Unit Tests 进行单元测试
- 使用 LLVM lit 测试框架进行 Lit 测试
测试
该链接器包含一套全面的单元测试用例,这些用例被设计成易于阅读和修改。这些测试涵盖链接器本身和各种链接器插件示例,帮助客户了解强大的链接器插件基础设施。
我们的团队还在模拟和设备平台执行内部应用程序的测试。
该链接器附带了 全面的面向用户的文档,其中阐明了链接器的行为,以及一个详细的 FAQ,其中介绍了常见问题和解决方案。
联系我们
该团队致力于不断评估和引入专注于嵌入式社区的功能。
我们邀请您加入我们改进链接器并使解决方案变得更好的行列。请随时在 GitHub 上提出您想处理的任何问题,或分享我们目前不支持的使用场景。
结束语
我们希望嵌入式链接器解决方案能够解决您想要解决的用例。
我们还要感谢 eld 团队 和我们整个 LLVM 团队为增强链接器所做的持续贡献。
如果您有任何想法要分享或想与我们交谈,请随时 通过 GitHub 与我们的团队联系。