【问题标题】:How to preprocess an ld linker script?如何预处理 ld 链接描述文件?
【发布时间】:2024-01-15 16:43:01
【问题描述】:

当我翻阅L4 Pistachio micro-kernel 的来源时,我正在深入研究链接脚本的艺术。让我伤心的是 C 预处理器语法在链接器脚本中的使用方式,here for example(第 35 行)!

[...]

#include INC_GLUE_SA(offsets.h)

[...]

我在任何地方都找不到有关它的文档,并且我得到了诸如“这是不可能的”之类的答案。但我认为它在那里是因为它无论如何都可以使用......但是如何? 我显然尝试了“gcc -E”之类的东西,但没有奏效。

我觉得这种可能性很有趣,你有什么相关信息吗?

【问题讨论】:

  • 看起来INC_GLUE_SA 被定义为#define INC_GLUE_SA(x) <glue/__API__-__ARCH__/__SUBARCH__/x>

标签: c linker c-preprocessor ld


【解决方案1】:

我认为您对使用 C 预处理器的看法是正确的——至少对于这个项目而言。 kernel/Mk/Makeconf 包含以下规则:

#.INTERMEDIATE: lds.tmp
    lds.tmp: $(LDSCRIPT) $(SRCDIR)/Mk/Makeconf $(SRCDIR)/src/generic/macros.h $(BUILDDIR)/config/config.h
    @$(CPP) -DASSEMBLY $(PPFLAGS) -P -C $< -o $@

【讨论】:

  • 好的,谢谢!很明显 $(CPP) 实际上是“cpp”(如 C PreProcessor)命令,而不是像我一样的“c++”。 “-P”工作得很好!这对我来说很有趣:) 谢谢
【解决方案2】:

Pistachio 内核 runs the .lds file through cpp 的 Makefile 之一,用于生成最终的链接器脚本(如 lds.tmp)。

【讨论】: