2017-06-19 274 views
7

背景: 我们已经购买了一个软件产品,该产品可在Visual Studio中构建到32位Windows应用程序。我们希望将此应用程序移植到64位。如何将32位编译二进制转换为64位

此代码的任务关键组件是最初由第三方使用gFortran构建的黑盒静态库(.a文件)。原来的开发人员已经过世了,我们能够得到的Fortran源代码是不完整的,而不是这个库的版本(并且包含编译库中没有的关键错误)。他们没有使用VCS。

问题: 我想创建一个64位静态库,其代码在功能上等同于我们拥有的32位静态库。

我已经试过:

  • 使用反编译雪人获得C++源代码,在64位重新编译。这被证明是不可能的,因为生成的代码使用低级别的内部函数,这些函数似乎是gcc特有的。它可能无法正常工作,因为这些内在函数会编译成64位的功能不等同的代码。我可能需要一个更好的反编译器。
  • 很明显,x86程序集是有效的x86_64程序集,所以我简单地看了一下为什么我不能通过64位汇编程序运行程序集。原来在64位中ABI不同,所以调用约定不匹配。 MAYBE我可以手动将函数调用转换为适当的约定,并使其余部分保持不变,但这可能是棘手的问题。意见?
+5

*“因为生成的代码使用了似乎是gcc特有的低级内在函数”*如?这些很可能会转换成您选择的编译器(MSVC?)。我的意思是,*每个人*需要一个更好的反编译器,但这些不完全可用。内在因素的要点是它们将你从平台上分离出来,所以如果你将它们用在一个针对x86-64的库中,那么你会得到x86-64代码。另外,正如你所说的,x86-32与x86-64非常相似,所以翻译代码很简单。 SO太宽;聘请程序员。 –

+1

@CodyGray我看到的是__return_address()和__zero_stack_offset()。而不是生成的代码使用自己的函数参数,而是手动复制汇编代码以便从堆栈中读取它们。因为ABI不同,所以这不会在64位上飞行。你是正确的__return_address()可能具有MSVC等效_ReturnAddress(),但我找不到__zero_stack_offset()的等效项。他们的记录很差。感谢您的输入。 – Veggie

+0

“如何将32位编译二进制转换为64位” - 通过将源代码重新编译为64位。 –

回答

7

您可以保留32位二进制库,但将其加载到32位主机进程中,并使用某种IPC(共享内存,命名管道,本地回送网络连接等)来传输数据到/从您的64位进程。

这种方法的另一个优点是,如果Fortran代码崩溃,那么它只会降低子主机进程,而不是您的主应用程序,并且您的程序可以立即启动它;如果它是一个单线程的Fortran程序,那么你可以为多核并行做好几个实例。

+0

我担心你可能会建议这个...... – Veggie

+2

这是一个黑客(最好)。保持乐观,继续前进。 –

+1

@JesperJuhl:这不是黑客。基本上,COM代理过程如何(以及为什么)工作。启动代理过程是一个解决的问题。 IPC是一个解决的问题。 – IInspectable

相关问题