Tizen gcc汇编程序生成ELF而不是对象文件--无法创建静态库
我正在尝试使用该工具集构建zlib。作为构建过程的一部分,源文件应该使用Tizen gcc汇编程序生成ELF而不是对象文件--无法创建静态库,gcc,static-libraries,elf,tizen,Gcc,Static Libraries,Elf,Tizen,我正在尝试使用该工具集构建zlib。作为构建过程的一部分,源文件应该使用arm linux gnu eabi gcc-c编译成对象,然后与libtool合并成归档文件,但是libtool失败,并抱怨传递给它的.o文件不是对象文件(库中不允许) 经过检查,我发现armlinuxgnueabigcc-c正在生成ELF文件而不是对象文件,这是我以前从未见过的。当我将-c-v传递给编译器时,我可以看到链接器没有被调用。那么为什么使用ELF格式呢 然后,我尝试调用arm linux gnu eabi gc
arm linux gnu eabi gcc-c
编译成对象,然后与libtool
合并成归档文件,但是libtool
失败,并抱怨传递给它的.o
文件不是对象文件(库中不允许)
经过检查,我发现armlinuxgnueabigcc-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})。这四个人的行为方式都一样
至少这个armlinuxgnueabigcc
是一致的,因为我可以向它传递许多.o
ELF文件,并且它似乎可以正确地链接它们。但我仍然需要能够生成真实的对象文件,以便可以使用libtool
将它们归档到静态库中。有什么建议吗
正在生成ELF文件而不是对象文件
您非常困惑:ELF
和对象文件不是独占的,在Linux上所有的对象文件都是ELF
。换言之,这是工作的预期
ELF
文件可以有不同的类型:ET_REL
(可重新定位的对象文件)、ET_DYN
(共享库)和ET_EXEC
(可执行文件)
我仍然需要能够生成真实的对象文件,以便使用libtool将它们归档到静态库中
问题可能是libtool
无法识别非本地ELF
.o
文件,因为它可以将这些文件放入存档库中
一般来说,libtool
几乎总是问题的错误解决方案,不管问题是什么。其目的是“在一致、可移植的界面后面隐藏使用共享库的复杂性”。根据我的经验,它在所有平台上都无法实现这一目标
当然,如果您只想将一堆
.o
文件放入存档库,正确的方法是简单地使用*-linux-gnueabi-ar
,这应该没有问题。关于libtool
的有趣想法。我自己并没有真正使用过它,但许多项目似乎都在使用它,我在这里使用它只是因为zlib
想要它。我想我知道对象是ELF
文件,但在构建过程中却忘了这一点。谢谢你的解释。我最终解决了这个问题,确保正确定义了环境变量AR
,以便libtool
可以调用您提到的非本机AR
。