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)
我认为你可以根据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)
尽管这不是其主要目的,但您始终可以在链接器脚本上运行 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 添加为最终可执行文件构建配方的依赖项。我在许多项目中成功地使用了类似的流程。
| 归档时间: |
|
| 查看次数: |
11104 次 |
| 最近记录: |