从一个源文件生成多个对象文件

问题描述 投票:0回答:1

问题

在编译期间获取多个源文件并生成单个目标文件是相当常见的(

g++ -c file1.cpp file2.cpp
)。是否可以采取另一种方式并从单个源文件创建多个对象,最好是通过 ELF 部分?我知道这可以通过
elfutils
和朋友事后通过外部工具实现,但不幸的是,我陷入了托管构建环境中,并且在构建过程中引入新工具过于复杂(至少目前如此)。

其他信息

这最终是为了一些动态符号操作,类似于U-Boot的命令注册或Linux的initcall机制。为了帮助实现这一点,我创建了常用的

__attribute__((used,section=""))
宏来在已知部分中生成这些符号。不幸的是,托管构建环境强制使用中间静态库,这导致我生成的符号被删除,因为它们在主二进制文件中未引用。

我知道

-Wl,-whole-archive
,但我不想在我的整个档案上运行它,因为这是一个嵌入式项目,空间非常宝贵。因此,我希望我可以将已知部分中的所有动态符号分解出来,并将它们组合成一个对象,该对象将形成自己的档案,然后可以完全包含在内,而不会造成空间损失。

我也知道

--undefined
但我不提前知道具体的符号名称,所以我不知道如果没有大量脆弱的额外解析,这将如何工作。此外,我被困在 SoC 提供的 GCC 8.4.0 工具链上,它不支持任何类型的通配符像 LLVM 那样

gcc linker elf conditional-compilation
1个回答
0
投票

是否可以采取其他方式并从单个源文件创建多个对象

这是非常常见的(但不是在单个编译器调用中):

// x.c
#ifndef FOO
#define FOO Foo
#endif
int FOO() { return 42; }
gcc -c x.c -o foo.o
gcc -c x.c -DFOO=Bar -o bar.o
gcc -c x.c -DFOO=Baz -o baz.o

如果您的意思是“单个编译器调用中的多个对象文件”,那么不行——我知道没有编译器可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.