如何在LLVM中链接ELF静态库?

3
我有一个使用armcc在elf格式下创建的库文件(*.a),无法使用llvm或gcc重新编译(这是为armcc编写的汇编程序)。在Linux上,使用gnu ld链接它没有问题,但在Mac上使用llvm时会出现问题。由于obj文件具有不同的内部格式,因此它将显示“忽略文件...,因为它不是正在链接的架构”。是否有绕过这个问题的方法?是否有将elf转换为Mach-O格式的方法?是否可以告诉llvm使用elf格式?对于x86 / 86-64,Agner Fog编写了一个名为objconv的工具,但我正在寻找一个ARM工具。

如果该库是为Linux编译的,很可能无法在Darwin/iOS中使用。如果它只有汇编代码而没有系统调用/库调用,则可能可以进行转换。 - osgx
从技术上讲,这是可能的。它没有特定于操作系统的代码,但我没有找到任何工具/脚本/方法来在格式之间进行转换。 - Sam
我认为可以更容易地通过反汇编.a文件(使用ar解包)然后使用一些Mach-O汇编器(来自binutils)将其重新组装。 - osgx
ar只能提取obj文件。但是obj格式仍然不兼容 - Mac的ld将无法重新打包它们为Mach-O格式。 - Sam
需要对obj文件进行反汇编。我不知道arm的反汇编器,也许可以尝试使用objdump -d,然后将代码重新格式化为简单的.s文件? - osgx
1个回答

3

有一个来自binutils的objcopy,它可以将二进制文件从一种格式转换为另一种格式。我认为,你应该编译带有Linux和iOS BFDs的binutils。不幸的是,binutils对Mach-O的支持不完整(关于ARM+objcopy+Mach-O有一些负面报告)。

另请参阅:

另一种转换方式是重新组装(对每个.a归档文件中的.o文件进行反汇编,然后使用Mach-O兼容汇编器重新组装)。


Objcopy无法支持Mach-o,尤其是针对ARM。但我能够通过反汇编.o文件并使用本地汇编器重新组合它们来转换它。然而,这涉及一些手动编辑。 - Sam
Vasile,有两个名字相似的实用程序:objconv(来自Agner)和objcopy(来自binutils)。在2009年,binutils中对Mach-O的支持是不完整的,但事情可能会改变。 - osgx
Agner是x86的忠实粉丝,他永远不会转向ARM :) GNU在一段时间前停止了对Mach-O的支持。但是手动编辑汇编代码所投入的时间是值得的。我的应用现在运行速度提高了5倍 :) - Sam
不知道“fan”的情况;但他说,“更新x86手册需要我的时间”,并且他不会在他的手册中描述ARM。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接