【问题标题】:Can I use Preprocessor Directives in .ld file我可以在 .ld 文件中使用预处理器指令吗
【发布时间】:2015-03-03 16:42:37
【问题描述】:

我可以在 .ld 文件中使用预处理器指令吗? 我需要使用两组 .ld 文件中的一组,并且想让构建引擎使用宏来处理它,我可以这样做吗?

【问题讨论】:

    标签: c gcc linker


    【解决方案1】:

    是的,你可以。您需要为链接描述文件手动运行预处理器,如下所示:

    in="your_linker_script.ld"
    out="generated_script.ld"
    cflags=-Iinclude/
    
    gcc -E -x c $cflags $in | grep -v '^#' >$out
    

    标志:

    • -E 指定 GCC 只运行预处理器
    • -x c 告诉 GCC 将您的链接描述文件视为 C 源文件(需要使用 LD 脚本运行 GCC)

    或者您可以简单地使用cpp 工具,它实际上是C 预处理器。

    在此之后,您将能够使用生成的链接描述文件来构建您的程序(例如在 Makefile 中)。

    示例

    这是我在项目中解决这个问题的方法:

    1. Here 是我的链接器脚本使用预处理器(#include 指令和CONFIG_TEXT_BASE 常量)。摘录:

       #include <config.h>
      
       . = CONFIG_TEXT_BASE;
      
    2. Here 是生成预处理链接器脚本的脚本。摘录:

       gcc -E -x c -Iinclude $cflags $in | grep -v '^#'    >>$out
      
    3. Here 是我的Makefile,它在$(LDS_GEN) 目标(第 53 行)处生成预处理的链接器脚本,并且此生成的脚本用于构建结果二进制文件(第 42 行)。摘录:

       $(LDS_GEN): $(LDS)
               build/gen-lds.sh $(LDS) $(LDS_GEN) $(CFLAGS)
      
       $(APP).bin: $(OBJS) $(LDS_GEN)
               $(LD) $(OBJS) -T $(LDS_GEN) -o $(APP).elf
      

    【讨论】:

      【解决方案2】:

      为了简化 Sam 的回答,我将以下内容添加到我的 makefile 中,然后我们就走了:)

      PRE_LD_FILE = $(PROG_NAME).ld
      LD_FILE = $(PROG_NAME)_generated.ld
      
      $(LD_FILE) : $(PRE_LD_FILE)
          cpp $(PRE_LD_FILE) | grep -v '^#'   >>$(LD_FILE)
      

      【讨论】:

        【解决方案3】:

        很久以后的小更新。这种预处理方式一直有效,直到内存文件不包含欺骗预处理器的行。例如:

        "KEEP(*path/*.o(.rodata .rodata*))"
        

        路径后的“/*”被认为是注释开始(该行包含被认为是 C 多行注释开始而不是匹配模式的内容)。

        此行对链接器有效,但它被视为注释,C 预处理器的输出将删除所有内容,直到找到假定的结束注释:

        "KEEP(*path"
        

        生成的文件对于链接器显然无效。我暂时没有解决办法。

        【讨论】:

        • 使用 gcc 预处理器的“-CC”选项解决:gcc -CC -E -x c ...
        • 我正在使用的开发系统在其自动构建系统中内置了 .ld 文件的预处理步骤。我通过将 path/* 更改为 path/?* 解决了这个问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        相关资源
        最近更新 更多