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