链接器命令语言 LD 的条件语句

joo*_*oop 4 ld linker-scripts cortex-m

GNU LD 链接器命令语言有条件语句吗?

背景:我正在为 ARM Cortex m0+ 开发固件,它由引导加载程序和应用程序组成。两者都在单独的项目中进行编译和刷新以定位目标,但我使用一个带有驱动程序、makefile 和加载器脚本符号链接的框架,这样我就可以为我制作的每个应用程序重复使用这些文件,而无需为每个应用程序复制这些文件。目前我有两个加载程序文件,分别用于引导加载程序和应用程序(makefile 自动指定相应的文件),内存分配如下:

引导装载程序

MEMORY { 
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
  ram   (rwx) : ORIGIN = 0x1FFFF000, LENGTH =  16K
}
Run Code Online (Sandbox Code Playgroud)

应用程序

MEMORY { 
  flash (rx)  : ORIGIN = 0x00004000, LENGTH = 112K
  ram   (rwx) : ORIGIN = 0x1FFFF000, LENGTH =  16K
}
Run Code Online (Sandbox Code Playgroud)

就像 makefile 一样,我想将它们合并为类似的内容(使用 C 表达式来澄清)

MEMORY { 
#ifdef(bootloaderSymbol)
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
#else
  flash (rx)  : ORIGIN = 0x00004000, LENGTH = 112K
#endif
  ram   (rwx) : ORIGIN = 0x1FFFF000, LENGTH =  16K
}
Run Code Online (Sandbox Code Playgroud)

Bin*_*n S 6

我认为你可以根据https://sourceware.org/binutils/docs/ld/Builtin-Functions.html尝试“DEFINED(symbol)”

另外,请不要忘记将“--defsym = bootloaderSymbol = 1”传递给ld。

MEMORY {
    flash (rx)  : ORIGIN = DEFINED(bootloaderSymbol) ? 0x00000000 : 0x00004000, LENGTH = DEFINED(bootloaderSymbol) ? 112K : 16K
    ram   (rwx) : ORIGIN = 0x1FFFF000, LENGTH =  16K
}
Run Code Online (Sandbox Code Playgroud)


mfr*_*fro 5

尽管这不是其主要目的,但您始终可以在链接器脚本上运行 C 预处理器 (cpp):

#if defined(MACHINE1)
#    define TARGET_ADDRESS 0x80000000
#    define SDRAM_START xxx
#    define SDRAM_SIZE yyy
#    define ROMFLAGS   rx
#elif defined(MACHINE2)
#    define TARGET_ADDRESS 0x40000000
#    define SDRAM_START zzz
#    define SDRAM_SIZE  aaa
#    define ROMFLAGS rwx
#else
#    error unknown machine
#endif

MEMORY
{
   rom (ROMFLAGS) : ORIGIN = TARGET_ADDRESS, LENGTH = 0x00100000
   ram (WX) : ORIGIN = SDRAM_START + SDRAM_SIZE - 0x00200000, LENGTH = 0x00100000
   driver_ram (WX) : ORIGIN = SDRAM_START + SDRAM_SIZE - 0x00100000, LENGTH = 0x00100000
}

...
Run Code Online (Sandbox Code Playgroud)

您只需要确保您的宏不会与链接器脚本语法发生冲突。然后将链接器脚本保存为 xxx.lk.in(而不是 xxx.lk),并将配方添加到 Makefile 中:

xxx.lk: xxx.lk.in
        $(CPP) -P $(INCLUDE) -D$(MACHINE) $< $@
Run Code Online (Sandbox Code Playgroud)

剩下要做的就是将 xxx.lk 添加为最终可执行文件构建配方的依赖项。我在许多项目中成功地使用了类似的流程。