Linker 链接器脚本中的Make或Shell变量

Linker 链接器脚本中的Make或Shell变量,linker,makefile,Linker,Makefile,链接器脚本是否可以访问makefile/shell变量,并根据所述变量做出决策 例如,假设我想在不使用其他链接器脚本的情况下更改下面RAM区域的开头,是否可以使用make变量来执行此操作 MEMORY { ifeq ($(SOME_VAR),0) RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K else RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K endif } 我对此表示怀疑,尽管这取决于您使用的链接器。链接

链接器脚本是否可以访问makefile/shell变量,并根据所述变量做出决策

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

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

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

如果在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的一部分,仅当makefiles在所有相关规则中使用$(LDSCRIPT)作为先决条件时才有效。

ld不会从环境中导入任何变量,因此无法直接使用它们。执行此操作的最佳方法是使用要导出的环境变量创建自己的链接器脚本,并让原始链接器脚本包含它,如下所示:

生成文件:

foo:
    echo SOMEVAR=$(SOMEVAR) > environment_linker_script
    ld ...
环境链接器脚本:

SOMEVAR=xxx
include environment_linker_script

ifeq ($(SOME_VAR),0) ...
主链接器脚本:

SOMEVAR=xxx
include environment_linker_script

ifeq ($(SOME_VAR),0) ...
我正在使用ld(来自GCC工具集)。我曾考虑过生成脚本,但我希望不要对周围的基础设施进行太多修改。无论如何,我决定简单地使用另一个链接器脚本,并在链接阶段根据make变量选择其中一个。这是一个比生成脚本更简单的解决方案。谢谢你的回答。