小编Ara*_*ind的帖子

GNU LD:如何覆盖由-T指定的链接描述文件定义的符号值(地址)

我的用例如下:

  • 我使用的是基于Makefile的项目附带的典型SDK
  • 我相信链接器是修补gcc.gcc --version给了我4.3.4
  • SDK定义链接器脚本(让我们称之为Linker.ld)
  • Linker.ld包含LinkerMemMap.cfg,它定义链接ELF图像中各个部分的绝对地址
  • SDK提供基于Makefile(GNU Make 3.81)的应用程序模板并自行创建
  • 在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)

什么有效:

  • 我在makefile中尝试过,在链接最终的ELF图像之前,将LinkerMemMap.cfg(由Linker.ld包含)复制到构建目录并对其进行修补以重新定义SYMBOL_RAM_START.这确实有效,因为链接器首先在当前文件夹中搜索链接描述文件和链接描述文件所包含的文件.

什么不:

  • 不幸的是,我们的利益相关者认为上述方法风险太大且难以理解.我想覆盖链接器命令行上的符号值,如下所示:

    1. 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

    2. 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

    3. 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

这些似乎都不会对链接器创建的链接图像产生任何影响. …

gcc ld linker-scripts

11
推荐指数
1
解决办法
9933
查看次数

标签 统计

gcc ×1

ld ×1

linker-scripts ×1