嵌入式工具链中生成Linker Script的组件及相关逻辑疑问
嵌入式工具链相关问题解答
1. 谁负责生成链接脚本(Linker Script)?
链接脚本主要由嵌入式开发者根据目标硬件的内存布局(比如ROM、RAM的地址范围、大小)手动编写。但如果用户没有提供自定义脚本,链接器(比如GNU工具链中的ld)会调用内置的默认链接脚本完成链接工作。你可以通过执行ld --verbose命令查看GNU ld的默认链接脚本内容。
2. 链接器为何要自行生成内存段定义的脚本?
链接器的核心工作是把多个目标文件合并成可在目标硬件上运行的可执行文件,这要求它必须明确知道硬件的内存分布:
- 它需要将只读的代码段(
.text)放到ROM/Flash区域,可读写的数据段(.data)放到RAM区域,未初始化的数据段(.bss)分配到RAM并标记为需要清零 - 默认链接脚本是链接器针对通用嵌入式场景预设的内存布局,能满足基础的链接需求,让开发者在没写自定义脚本时也能快速得到可运行的程序
- 但如果目标硬件有特殊内存布局(比如多块RAM、专属外设内存区域),开发者必须手写自定义脚本覆盖默认逻辑,才能保证程序适配硬件
3. 符号表、映射文件由谁生成?
- 符号表(Symbol Table):编译阶段,汇编器(
as)会在目标文件(.o)中生成符号表,记录函数、全局变量的名称、地址等信息;链接阶段,链接器会合并所有目标文件的符号表,完成符号解析和重定位,最终在可执行文件中保留(或通过-s参数去除)符号表。 - 映射文件(Map File):是链接器生成的辅助文件。当给链接器传递
-Map=output.map这类参数时,ld会输出映射文件,里面包含各内存段的地址、大小,以及符号的地址信息,用于调试和验证内存布局是否符合预期。
内容的提问来源于stack exchange,提问作者Ahmed Hesham
相关产品推荐
相关产品推荐

