gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:39:13 31 4
gpt4 key购买 nike

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

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

引导加载程序

MEMORY { 
flash (rx) : ORIGIN = 0x00000000, LENGTH = 16K
ram (rwx) : ORIGIN = 0x1FFFF000, LENGTH = 16K
}

应用程序
MEMORY { 
flash (rx) : ORIGIN = 0x00004000, LENGTH = 112K
ram (rwx) : ORIGIN = 0x1FFFF000, LENGTH = 16K
}

像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
}

最佳答案

虽然它不是它的主要目的,但您始终可以运行 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
}

...

您只需要确保您的宏不会与链接描述文件语法冲突。然后将您的链接器脚本保存为 xxx.lk.in(而不是 xxx.lk)并在您的 Makefile 中添加一个配方:
xxx.lk: xxx.lk.in
$(CPP) -P $(INCLUDE) -D$(MACHINE) $< $@

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

关于ld - 链接器命令语言 LD 的条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796465/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com