9

链接描述文件是否可以访问 makefile/shell 变量并根据所述变量做出决定?

例如,假设我想在不使用不同链接器脚本的情况下更改下面 RAM 区域的开头,是否可以使用 make 变量来执行此操作?

MEMORY
{
ifeq ($(SOME_VAR),0)
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K
else
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K
endif
}
4

3 回答 3

6

ld 不会从环境中导入任何变量,因此不能直接使用它们。最好的方法是使用要导出的环境变量创建自己的链接器脚本,并让原始链接器脚本包含它:

生成文件:

foo:
    echo SOMEVAR=$(SOMEVAR) > environment_linker_script
    ld ...

环境链接器脚本:

SOMEVAR=xxx

master_linker_script:

include environment_linker_script

ifeq ($(SOME_VAR),0) ...
于 2016-04-21T15:29:44.637 回答
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) 作为所有相关规则的先决条件时才有效。

于 2014-08-22T09:15:52.857 回答
0

我对此表示怀疑,尽管它取决于您使用的链接器。链接器可能会从 make 中读取一些导出的变量,但正如我所说,所有这些都取决于特定的链接器功能。另一个想法可能是只要链接器文件不会太复杂,一个选择是使用您的 makefile 实际生成它。有很多关于让 makefile 生成头文件的例子,你可以按照相同的路径生成链接器文件。

于 2012-06-08T01:42:31.443 回答