首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象文件转换为其他体系结构

将对象文件转换为其他体系结构
EN

Stack Overflow用户
提问于 2012-12-30 22:35:58
回答 7查看 3.7K关注 0票数 4

我正在尝试使用Wifi-Dongle和覆盆子Pi。加密狗的供应商提供了一个Linux驱动程序,我可以在ARM体系结构上成功编译,但是,驱动程序附带的一个目标文件是为x86体系结构预编译的,这导致链接器失败。

我知道重新编译那个(相当大的)文件会容易得多,但我无法访问源代码。

是否可以将对象文件从x86体系结构转换为ARM体系结构?

谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-12-31 12:24:26

嗯,不,在我看来是在浪费时间。Wi-Fi驱动很复杂,你说这个麻烦的目标文件很“大”。很多痛苦需要转换,成功调试的机会微乎其微。此外,在这一个对象文件和系统的其余部分之间传递的任何参数都不会在x86和ARM之间直接转换。

票数 8
EN

Stack Overflow用户

发布于 2013-01-02 05:44:17

理论上是这样的。在没有访问源代码的情况下,在一个真正的内核驱动程序上做这件事将是困难的。

如果目标文件具有高质量的反汇编,并且目标文件中的代码行为良好(使用标准调用约定,没有自修改代码),则可以自动将X86指令转换为arm指令。然而,你可能没有高质量的反汇编。特别是,目标文件的某些部分可能无法正确分类为执行正常递归下降反汇编的代码或数据。如果您将数据错误地解释为代码,它将被转换为ARM代码,而不是按原样复制,因此将具有错误的值。这可能会导致代码不能正常工作。

即使您很幸运,并且可以正确地对目标文件中的所有地址进行分类,仍然有几个问题会让您陷入困境:

  1. X86上的调用约定与ARM上的调用约定不同。这意味着您必须确定与X86调用约定相关的模式,并将其更改为使用ARM调用约定。这是一次不平凡的重写。
  2. ARM上的硬件接口与X86上的不同。为了翻译代码,您必须了解驱动程序是如何工作的。这将需要一个实质性的X86硬件可比较层,或者驱动程序如何工作的逆向工程。如果你可以对驱动程序进行逆向工程,那么你就不需要翻译它了。你可以只写一个arm版本。
  3. 内部内核APIS在ARM和X86之间是不同的。您必须了解这些差异以及如何在它们之间进行转换。
  4. 内核使用了一种“替代”机制,当代码第一次加载到内核中时,这种机制将动态重写机器代码。例如,在单处理器机器上,锁通常被替换为no-ops以提高性能。像"popcnt“这样的指令被不支持它的机器上的函数调用所取代,等等。它在内核中的使用是非常普遍的。这意味着根据上面给出的定义,对象is file中的代码很可能不是“良好的行为”。您必须验证对象文件是否未使用该机制,或者找到一种方法来转换该机制的用法。
  5. X86使用与ARM不同的内存模型。为了“安全地”将X86代码转换为ARM (而不引入竞争条件),您必须在每次内存访问之后引入内存屏障。这将在ARM芯片上导致非常糟糕的性能。找出什么时候需要引入内存围栏(而不是到处去做)是一个极其困难的问题。在这种类型的分析中,最成功的尝试需要自定义类型系统,而目标文件中不会有这样的系统。

你最好的选择(通向成功的最快途径)是尝试对目标文件所做的事情进行逆向工程,然后直接替换它。

票数 6
EN

Stack Overflow用户

发布于 2012-12-31 22:19:18

没有合理的方法来做到这一点。联系制造商,询问他们是否可以提供ARM代码形式的相关代码,因为x86对您没有用处。如果他们不能做到这一点,你必须找到一个不同的供应商的硬件,具有ARM版本,或完全开放源代码,所有的组件,或软件供应商假设有其他来源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14091579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档