【问题标题】:Tizen gcc assembler generating ELFs instead of object files -- cannot create static libraryTizen gcc 汇编器生成 ELF 而不是目标文件——无法创建静态库
【发布时间】:2016-10-12 13:27:36
【问题描述】:

我正在尝试使用 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 传递给编译器时,我可以看到链接器没有被调用。那么为什么是 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 文件传递​​给它,并且它似乎可以正确链接它们。但我仍然需要能够生成真实的目标文件,以便它们可以使用libtool 归档到静态库中。有什么建议吗?

【问题讨论】:

    标签: gcc static-libraries elf tizen


    【解决方案1】:

    正在生成 ELF 文件而不是目标文件,

    非常感到困惑:ELF 和目标文件不是独占的,在 Linux 上所有目标文件都是 ELF。换句话说,这是按预期工作的。

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

    我仍然需要能够生成真实的目标文件,以便可以使用 libtool 将它们归档到静态库中

    问题很可能是 libtool 无法识别非本机 ELF .o 文件作为它可以放入存档库的东西。

    一般来说,libtool 几乎总是错误解决问题的方法,不管问题是什么。它的stated goal 是为了“将使用共享库的复杂性隐藏在一致的、可移植的接口后面”。根据我的经验,它在所有平台上都无法实现这一目标。

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

    【讨论】:

    • libtool 的有趣想法。我自己还没有真正用过,但是好像很多项目都在用,我这里用它只是因为zlib想要它。
    • 我想我知道对象是ELF 文件,但在构建过程中忘记了这一点。谢谢你的解释。我最终通过确保正确定义环境变量AR 来解决问题,以便libtool 可以调用您提到的非本地ar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多