链接描述文件条件包含

linker script conditional includes

我正在将分散文件转换为 linker 文件。现在的问题是 armlink 可以在 link 时接受符号,例如 --predefine=-DSOME_VARIABLE,并且在分散文件中,其他头文件可以包含在 #include "someHeader.h 指令中。有些文件根据定义的符号包含在分散文件中,例如

#ifdef INCLUDE_RANDOM_FILE 
    randomFile (*) 
#endif

在 linker 脚本中这些选项不可用。是否有解决此问题的方法。

有两个相当简单的选项。

  1. 使用编译器预处理器并使用输出。
  2. 颠覆你的逻辑。

在 GCC 或任何编译器中使用 C 预处理器。

 $(CC) $(DEFINES) -E -P -o output.lds -x c-header input.lds

此选项允许完整范围的预处理器定义和条件包含。


invert 选项是为您需要的每个案例创建单独的主 'lds' 文件,然后包括公共部分。

flash.lds

start = 0xf000000;
size  = 0x100000;
include "common.lds"

ram.lds

start = 0x0;
size  = 0x10000;
include "common.lds"

同样可以是productiondebug变体。如果排列很低,这是相当容易的。否则,我会使用预处理。

bin-utils ld documentation 也有一个很好的例子 linkcmds.memory 文件。您必须 symlink 或在您的 Makefile 或构建过程中复制 linkcmds.memory 文件。


通过使用 weak 符号和存根文件以及不需要条件的例程,摆脱条件通常非常容易。