Ara*_*ind 11 gcc ld linker-scripts
我的用例如下:
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
我的要求如下:
什么有效:
什么不:
不幸的是,我们的利益相关者认为上述方法风险太大且难以理解.我想覆盖链接器命令行上的符号值,如下所示:
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
这些似乎都不会对链接器创建的链接图像产生任何影响.
Ara*_*ind 16
在等待某人回复时,我确实解决了这个问题.这里的问题很少,我想为可能犯同样错误的人解释我的发现.
首先,必须使用-Xlinker或-Wl指定要传递给链接器的任何选项.因此,在上述情况下,2和3都不起作用.更正后的2和3将如下:
已经是正确的了
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 -Xlinker --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -Xlinker --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
现在,对于上面的选项1和2,-defsym位于链接器脚本之后,SYMBOL_RAM_START已由链接描述文件定义.它确实覆盖了它.但是不会使用overriden值,因为已经定义了部分,因为已经使用了链接描述文件.
对于上面选项3的情况,SYMBOL_RAM_START是在链接器读取链接描述文件之前定义的.因此,解析链接描述文件时,脚本中指定的值将覆盖它.
解:
为了使其工作,链接器脚本需要有条件地初始化符号SYMBOL_RAM_START,如下所示:
SYMBOL_RAM_START = DEFINED( SYMBOL_RAM_START )?SYMBOL_RAM_START :DEFAULT_VALUE;
鉴于链接器脚本中的上述内容,当在包含链接描述文件之前定义了SYMBOL_RAM_START时(如上面的选项3中所示),它确实有效.但最后我不得不修补链接器脚本.
此解决方案并未真正覆盖符号,但提供了一种可以定义符号以便可以覆盖它的方法.