- 我正在使用带有Makefile的典型SDK
- 我相信链接器是经过修补的gcc。 gcc --version给出4.3.4
- SDK定义了链接器脚本(称为Linker.ld)
- Linker.ld包括LinkerMemMap.cfg,该文件定义了链接的ELF镜像中各个部分的绝对地址
- SDK基于Makefile提供应用程序模板(GNU Make 3.81)和make本身
- 在SDK提供的Makefile模板中,当调用gcc时,提供了Linker.ld的-T命令行选项,如下所示:
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
我的要求如下:
- 我想使用Linker.ld中定义的部分,并根据LinkerMemMap.cfg使用内存映射,但调整LinkerMemMap.cfg中定义的一个特定符号(称为SYMBOL_RAM_START)
适用的内容:
- 在链接最终的ELF映像之前,我尝试在makefile中将LinkerMemMap.cfg(由Linker.ld包含)复制到构建目录并对其进行修补以重新定义SYMBOL_RAM_START。这有效,因为链接器首先在当前文件夹中搜索链接器脚本和链接器脚本包含的文件。
不适用的内容:
不幸的是,我们的利益相关者认为上述方法过于冒险且复杂难懂。我想用以下方式在链接命令行上覆盖符号值:
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections,--defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
但这些似乎对链接器创建的链接映像没有任何影响。
- --defsym是否可以覆盖使用-T指定的链接脚本定义的符号?
- 你们中有人能看出我在这里做错了什么吗?
gdb
基本上是无用的,因为进程具有相同的(虚拟)地址。当我调试一个复杂的问题时,能够将内存位置分开是非常有帮助的。谢谢!参考:https://github.com/chaos4ever/chaos/commit/177957dac462b6134c5134e6567019f73a401b8b - Per Lundberg