【问题标题】:How to link elf static libs in llvm?如何在 llvm 中链接精灵静态库?
【发布时间】:2012-02-09 10:52:32
【问题描述】:

我有一个 lib (*.a) 文件,它是用 armcc 以 elf 格式创建的。不可能用 llvm 或 gcc 重新编译它。 (它是为 armcc 编写的汇编程序)。

将它与 gnu ld 链接在 Linux 上可以正常工作,但我在 Mac 上使用 llvm 时遇到问题。

由于 obj 文件的内部格式不同,它会说“忽略文件...不是被链接的架构”

有解决办法吗?一种将精灵转换为 Mach-O 格式的方法?告诉llvm关于精灵?

有这样一个用于 x86/86-64 的 tool,由 Agner Fog 编写,但我正在寻找一个 ARM 工具。

【问题讨论】:

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

标签: gcc linker arm llvm elf


【解决方案1】:

binutils 有一个objcopy,它应该将二进制从一种格式转换为另一种格式。我认为,您应该使用 Linux 和 iOS BFD 编译 binutils。不幸的是,binutils 对 Mach-O 的支持并不完整(有一些关于 ARM+objcopy+Mach-O 的负面报道)。

另见:

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

【讨论】:

  • Objcopy 不支持 Mach-o,尤其是对于 ARM。但是我能够通过反汇编 .o 文件并使用本机汇编程序重新组装它们来转换它。但是,它涉及一些手工编辑。
  • vasile,有两个名称相似的实用程序:objconv(来自 agner)和 objcopy(来自 binutils)。 2009 中 binutils 对 Mach-O 的支持不完整,但情况可能会发生变化。
  • Agner 是 x86 的忠实粉丝,他永远不会去 ARM :) 并且 GNU 前段时间停止了对 Mach-O 的支持。但是花在手工编辑汇编器上的时间是值得的。我的应用现在运行速度快了 5 倍 :)
  • 不知道风扇;但他说“更新 x86 手册需要我的时间”,他不会在他的手册中描述 ARM。
猜你喜欢
  • 2011-02-17
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多