Makefile中GCC传linker.ld与-Tlinker.ld参数的区别
GCC传入链接脚本的两种方式行为差异
两种写法的核心区别是GCC(实际是调用的ld链接器)对链接脚本文件的处理逻辑完全不同,对应你遇到的两个问题原因如下:
无-T参数直接传入linker.ld的处理逻辑
- 这种写法下,GCC不会把
linker.ld识别为你要使用的主链接脚本,只会把它当做普通的链接输入文件,传递给ld后作为补充链接脚本加载。 - ld启动时默认会加载对应架构的内置主链接脚本,这个默认脚本里已经提前定义了常规的内存区域(包括你声明的同名ram区域)、以及完整的段分配规则。你传入的补充脚本会在默认脚本之后执行,重复声明同名ram内存区域,就触发了
redeclaration of memory region警告。 - 这种模式下默认脚本的段分配规则完全生效,所以不会出现段找不到对应内存区域的错误,只是你自定义的内存配置会和默认配置冲突,达不到重映射RAM的预期效果。
带-Tlinker.ld参数传入的处理逻辑
-T参数的作用是明确告诉ld:放弃内置的默认主链接脚本,完全使用你指定的这个文件作为唯一的主链接脚本。- 你提供的
linker.ld只定义了MEMORY内存块,没有写任何SECTIONS段分配规则,链接器找不到规则把.data、.bss、.text这些标准可加载段分配到对应内存区域,就会抛出no memory region specified for loadable section .data错误。
修正建议
如果要实现自定义RAM重映射,使用-T指定脚本是正确路径,但你需要在现有MEMORY定义的基础上补全完整的SECTIONS段分配规则,明确各段的存放内存区域,不能只写内存区域定义。
内容的提问来源于stack exchange,提问作者avan989
相关产品推荐
相关产品推荐

