【问题标题】:Make or Shell Variables In Linker Script链接描述文件中的 Make 或 Shell 变量
【发布时间】:2012-06-11 20:51:11
【问题描述】:

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

例如,假设我想更改下面的 RAM 区域的开头而不使用不同的链接描述文件,是否可以使用 make 变量来执行此操作?

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

【问题讨论】:

    标签: linker makefile


    【解决方案1】:

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

    制作文件:

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

    环境链接器脚本:

    SOMEVAR=xxx
    

    master_linker_script:

    include environment_linker_script
    
    ifeq ($(SOME_VAR),0) ...
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我正在使用 ld(来自 GCC 工具集)。我考虑过生成脚本,但我希望不要过多地修改周围的 make 基础设施。无论如何,我决定简单地使用另一个链接器脚本,并在链接阶段根据 make 变量选择一个或另一个。这是一个比生成脚本更简单的解决方案。不过感谢您的回答。
      【解决方案3】:

      如果在 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) 作为先决条件时才有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 2021-11-17
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多