Daw*_*aha 2 linux x86 arm cpu-architecture
我正在尝试使用带有Raspberry Pi的Wifi-Dongle.加密狗的供应商提供了一个Linux驱动程序,我可以在ARM体系结构上成功编译,但是,驱动程序附带的一个目标文件是针对x86架构进行预编译的,这会导致链接器失败.
我知道再次编译那个(相当大的)文件要容易得多,但我无法访问源代码.
是否可以将该对象文件从x86架构转换为ARM架构?
谢谢!
小智 7
嗯,不,它看起来像浪费时间.Wi-Fi驱动程序很复杂,你说这个麻烦的目标文件是"大"的.翻译的痛苦很多,成功调试的机会很少.此外,在此一个目标文件和系统其余部分之间传递的任何参数都不会直接在x86和ARM之间进行转换.
理论上,是的。在不访问源代码的情况下在真正的内核驱动程序上执行此操作将很困难。
如果您对目标文件进行了高质量的反汇编,并且目标文件中的代码“表现良好”(使用标准调用约定,没有自修改代码),那么您可以自动将 X86 指令转换为 arm 指令。但是,您可能没有高质量的拆卸。特别是,在执行正常的递归下降反汇编时,目标文件的某些部分可能无法正确分类为代码或数据。如果您将数据误解为代码,它将被转换为 ARM 代码,而不是按原样复制,因此会有错误的值。这可能会导致代码无法正常工作。
即使你很幸运,并且可以正确地对目标文件中的所有地址进行分类,也有几个问题会让你感到困惑:
X86 上的调用约定与 ARM 上的调用约定不同。这意味着您必须识别与 X86 调用约定相关的模式并将它们更改为使用 ARM 调用约定。这是一个非平凡的重写。
ARM 上的硬件接口与 X86 上的不同。您必须了解驱动程序的工作原理才能翻译代码。这将需要大量的 X86 硬件可比性层,或者驱动程序如何工作的逆向工程。如果您可以对驱动程序进行逆向工程,那么您就不需要翻译它。你可以写一个arm版本。
ARM 和 X86 的内部内核 APIS 不同。您必须了解这些差异以及如何在它们之间进行转换。这很可能不是小事。
Linux 内核使用“替代”机制,当代码首次加载到内核时,它会动态地重写机器代码。例如,在单处理器机器上,锁通常被替换为无操作以提高性能。在不支持它的机器上,诸如“popcnt”之类的指令被替换为函数调用等。它在内核中的使用非常普遍。这意味着根据上面给出的定义,对象文件中的代码很可能不是“行为良好”。您必须要么验证目标文件不使用该机制,要么找到一种方法来转换它的用途。
X86 使用与 ARM 不同的内存模型。要“安全地”将 X86 代码转换为 ARM(不引入竞争条件),您必须在每次内存访问后引入内存栅栏。这将导致 ARM 芯片的性能非常糟糕。弄清楚何时需要引入内存栅栏(而不是到处都这样做)是一个非常困难的问题。在这种分析中最成功的尝试需要自定义类型系统,而目标文件中不会有这些系统。
您最好的选择(成功的最快途径)是尝试对有问题的目标文件进行反向工程,然后替换它。
| 归档时间: |
|
| 查看次数: |
2908 次 |
| 最近记录: |