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

时间:2015-03-03 16:42:37

标签: c gcc linker

我可以在.ld文件中使用预处理程序指令吗? 我需要使用两组.ld文件中的一组,并希望让Build引擎使用宏,我可以这样做吗?

3 个答案:

答案 0 :(得分:5)

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

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>
    
  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
    

答案 1 :(得分:0)

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

createTibble <- function(mtcars, i, j) {
    is_missing <- missing(j)
    mtcars %>% filter(am == i) %>% filter(if(is_missing) TRUE else cyl == j)
}

createTibble(mtcars, 1)  

#    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#8  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#9  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#10 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
#11 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
#13 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

createTibble(mtcars, 1, 4) 

#   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#4 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#5 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#6 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#7 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#8 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2 

答案 2 :(得分:0)

长时间更新。这种预处理方式一直有效,直到内存文件中没有包含欺骗预处理器的行为止。例如:

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

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

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

"KEEP(*path"

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