我可以在.ld文件中使用预处理程序指令吗

Kun*_*nal 4 c linker gcc

我可以在.ld文件中使用预处理程序指令吗?我需要使用两组.ld文件之一,并想让Build引擎使用宏来代替它,我可以这样做吗?

Sam*_*nko 6

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

in="your_linker_script.ld"
out="generated_script.ld"
cflags=-Iinclude/

gcc -E -x c $cflags $in | grep -v '^#' >$out
Run Code Online (Sandbox Code Playgroud)

标志:

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

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

之后,您将能够使用生成的链接程序脚本来构建您的程序(例如在Makefile中)。

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

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

    #include <config.h>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 是生成预处理链接脚本的脚本。摘抄:

    gcc -E -x c -Iinclude $cflags $in | grep -v '^#'    >>$out
    
    Run Code Online (Sandbox Code Playgroud)
  3. 是my 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
    
    Run Code Online (Sandbox Code Playgroud)