链接描述文件是否可以访问 makefile/shell 变量并根据所述变量做出决定?
例如,假设我想在不使用不同链接器脚本的情况下更改下面 RAM 区域的开头,是否可以使用 make 变量来执行此操作?
MEMORY
{
ifeq ($(SOME_VAR),0)
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K
else
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K
endif
}
ld 不会从环境中导入任何变量,因此不能直接使用它们。最好的方法是使用要导出的环境变量创建自己的链接器脚本,并让原始链接器脚本包含它:
生成文件:
foo:
echo SOMEVAR=$(SOMEVAR) > environment_linker_script
ld ...
环境链接器脚本:
SOMEVAR=xxx
master_linker_script:
include environment_linker_script
ifeq ($(SOME_VAR),0) ...
如果在 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)
说明:这是 makefile 的一部分,只有在 makefile 使用 $(LDSCRIPT) 作为所有相关规则的先决条件时才有效。
我对此表示怀疑,尽管它取决于您使用的链接器。链接器可能会从 make 中读取一些导出的变量,但正如我所说,所有这些都取决于特定的链接器功能。另一个想法可能是只要链接器文件不会太复杂,一个选择是使用您的 makefile 实际生成它。有很多关于让 makefile 生成头文件的例子,你可以按照相同的路径生成链接器文件。