Tizen gcc 汇编程序生成 ELF 而不是目标文件——无法创建静态库

Tizen gcc assembler generating ELFs instead of object files -- cannot create static library

我正在尝试使用 Tizen 工具集构建 zlib。作为构建过程的一部分,源文件应该用 arm-linux-gnu-eabi-gcc -c 编译成对象,然后用 libtool 组合成一个存档,但是 libtool 失败并抱怨每个.o 个文件传递给它 is not an object file (not allowed in a library).

经过检查,我发现 arm-linux-gnu-eabi-gcc -c 正在生成 ELF 文件而不是目标文件,这是我以前从未见过的。当我将 -c -v 传递给编译器时,我可以看到没有调用 linker。那么为什么是 ELF 格式?

然后我尝试调用 arm-linux-gnu-eabi-gcc -S,然后调用 arm-linux-gnu-eabi-as,发现汇编器本身正在生成 ELF 文件。

这是一个例子:

% echo "int main(void) { return 0; }" > main.c
% arm-linux-gnueabi-gcc main.c -S -o main.s
% arm-linux-gnueabi-as main.s -o main.o
% file main.o
main.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

Tizen 工具集包括四个编译器({i386,arm} 和 {4.6,4.9})。四个人的行为都一样。

至少这个 arm-linux-gnueabi-gcc 是一致的,因为我可以向它传递许多 .o 个 ELF 文件,而且它似乎 link 它们正确。但是我仍然需要能够生成真实的目标文件,以便可以将它们归档到具有 libtool 的静态库中。有什么建议吗?

is generating ELF files rather than object files,

非常困惑:ELF和目标文件不排斥,Linux 全部目标文件是 ELF。换句话说,这是按预期工作的。

ELF 文件可以有不同的类型:ET_REL(可重定位 object 文件),ET_DYN(共享库)和 ET_EXEC(可执行文件)。

I still need to be able to generate real object files so that they can be archived into a static library with libtool

问题可能是 libtool 无法将非本地 ELF .o 文件识别为可以放入存档库的文件。

一般来说,libtool 几乎总是 错误的 解决问题的方法,无论问题是什么。它的 stated goal 是 "hide the complexity of using shared libraries behind a consistent, portable interface"。根据我的经验,它在所有平台上都无法实现该目标。

当然,如果您 只是 想将一堆 .o 文件放入存档库,正确的方法是简单地使用 *-linux-gnueabi-ar 应该没问题。