如何将32位编译二进制转换为64位

时间:2017-06-19 16:15:30

标签: c++ assembly x86-64 32bit-64bit decompiler

背景 我们已经获得了一个在Visual Studio中构建为32位Windows应用程序的软件产品。我们希望将此应用程序移植到64位。

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

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

我尝试过的事情:

  • 使用Snowman反编译器获取C ++源代码,以64位重新编译。这被证明是不可能的,因为生成的代码使用看似特定于gcc的低级内部函数。它可能无论如何都不会起作用,因为这样的内在函数会编译成64位不具有功能等效的代码。我可能需要一个更好的反编译器。
  • 显然x86程序集是有效的x86_64程序集,所以我简要介绍了为什么我不能通过64位汇编程序运行程序集。事实证明ABI在64位上是不同的,因此呼叫约定不会匹配。可能我可以手动将函数调用转换为正确的约定,其余部分保持不变,但这可能是一个棘手的问题。意见?

1 个答案:

答案 0 :(得分:9)

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

这种方法的另一个优点是,如果Fortran代码崩溃,那么它只会关闭子主机进程,而不是你的主应用程序,你的程序可以立即重新启动它;如果它是一个单线程Fortran程序,那么你可以启动多个实例来实现多核并行。