c++ - 如何将 32 位编译二进制文件转换为 64 位

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

<分区>

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

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

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

我尝试过的:

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

最佳答案

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

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

关于c++ - 如何将 32 位编译二进制文件转换为 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44635394/

相关文章:

c++ - 将整数放入队列 <char> C++

c++ - boost::filesystem::path 和 std::string

linux - callq 命令参数的含义是什么?

assembly - 从Intel上的CPUID结果了解TLB

python - PyEval_CallObject 和 PyObject_CallObject 返回一个空对象

C++ vector 的唯一指针实践

c++ - 分析 Windows : what does the error message tell us? 中的崩溃

assembly - assembly 中的"global main"

c - MASM:从程序集访问全局 C 变量

assembly - 如何在(发布的)Rust版本中找到函数的汇编代码?