1. ARM链接器符号管理机制解析
在嵌入式系统开发中,链接器作为构建过程的最后环节,承担着将编译后的目标文件组合成可执行镜像的关键任务。ARM架构的链接器armlink提供了强大的符号管理功能,特别是通过符号定义文件(symdefs)实现跨镜像的全局符号访问。
1.1 符号定义文件(symdefs)工作原理
符号定义文件本质上是一个不包含实际代码和数据的特殊对象文件,其核心作用是记录全局符号的地址和类型信息。当我们需要让一个镜像访问另一个镜像中的全局符号时(例如ROM中的固件函数被RAM中的应用程序调用),symdefs文件就成为了桥梁。
文件生成命令示例:
bash复制armlink -symdefs firmware.symdefs firmware.o
典型symdefs文件结构包含三个关键部分:
code复制#<SYMDEFS># ARM Linker, ADS1.2 [Build 776]: Last Updated: Tue Jul 24 13:56:35 2001
; 示例注释行(以;或#开头)
0x00001000 A function1 ; ARM代码函数
0x00002000 T function2 ; Thumb代码函数
0x00003300 D global_var ; 数据符号
重要提示:文件首行必须是
#<SYMDEFS>#标识,这是armlink识别symdefs文件的关键。后续行包含符号地址(0x前缀十六进制)、类型标识符(A/T/D)和符号名称。
1.2 符号类型与属性详解
armlink处理的符号具有以下关键属性:
| 类型标识 | 含义 | 典型应用场景 |
|---|---|---|
| A | ARM指令代码 | 需要32位对齐的ARM函数 |
| T | Thumb指令代码 | 空间敏感的16位指令函数 |
| D | 数据 | 全局变量、常量表等 |
符号处理规则:
- 重复定义检查:如果同一符号在多个
