链接器脚本是否可以访问makefile/shell变量并根据所述变量做出决定?
例如,假设我想在不使用其他链接器脚本的情况下更改下面 RAM 区域的开头,是否可以使用 make 变量来执行此操作?
MEMORY
{
ifeq ($(SOME_VAR),0)
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K
else
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K
endif
}
不会从环境中导入任何变量,因此不能直接使用它们。 执行此操作的最佳方法是使用要导出的环境变量创建自己的链接器脚本,并让原始链接器脚本按如下所示包含它:
制作文件:
foo:
echo SOMEVAR=$(SOMEVAR) > environment_linker_script
ld ...
enviroment_linker_script:
SOMEVAR=xxx
master_linker_script:
include environment_linker_script
ifeq ($(SOME_VAR),0) ...
我对此表示怀疑,尽管这取决于您使用的链接器。链接器可能会从 make 读取一些导出的变量,但正如我所说,所有这些都取决于特定的链接器功能。另一个想法可能是,只要链接器文件不会太复杂,一种选择是使用 makefile 实际生成它。你可以谷歌搜索很多关于让makefile生成头文件的例子,你可以按照相同的路径来生成链接器文件。
如果在 makefile 中决定多个链接器脚本中的哪一个的解决方案是不够的,那么在 make 中生成脚本可能是一个可行的选择。
这个解决方案依赖于GNU make的逐字变量,这些变量被导出到环境变量中,并用$$引用。我用它来定义一个路径变量,用于在另一个链接器脚本中包含链接器脚本,如下所示:
define LDSCRIPT_DEF
/* Include the original libopencm3 linker script */
INCLUDE $(OPENCM3_DIR)/lib/stm32/f4/stm32f405x6.ld
/* Do custom stuff */
endef
export LDSCRIPT_DEF
$(LDSCRIPT):
@echo "$$LDSCRIPT_DEF" > $(LDSCRIPT)
说明:这是生成文件的一部分,仅当生成文件在所有相关规则中使用 $(LDSCRIPT) 作为先决条件时才有效。