【发布时间】:2013-10-23 20:44:23
【问题描述】:
我有一个为 Linux(使用 gcc)构建的 32 位纯二进制 C .so(由供应商提供),我需要链接到一个 64 位 C/C++ 应用程序(我正在开发)。有什么方法可以从我的应用程序访问这个库?
我知道需要注意处理 .so 中的参数和指向函数的指针,而且我知道很久以前这被认为基本上是不可能的(例如 this 帖子)。我希望情况有所改变。
【问题讨论】:
标签: gcc 32bit-64bit
我有一个为 Linux(使用 gcc)构建的 32 位纯二进制 C .so(由供应商提供),我需要链接到一个 64 位 C/C++ 应用程序(我正在开发)。有什么方法可以从我的应用程序访问这个库?
我知道需要注意处理 .so 中的参数和指向函数的指针,而且我知道很久以前这被认为基本上是不可能的(例如 this 帖子)。我希望情况有所改变。
【问题讨论】:
标签: gcc 32bit-64bit
也许可以将一些汇编胶水代码组合在一起,以将函数参数和返回值从一个模块转换到另一个模块,并翻转处理器模式。可能会破解链接器,因此它不仅会立即拒绝它(或破解 .so 文件,因此链接器不知道)。而且你必须教 64 位动态链接器如何进行 32 位重定位,等等等等。
但是,当您点击 32 位范围之外的指针时会发生什么?说到这里,如果 32 位代码在 64 位地址加载会发生什么?现在必须教内核将 这个 64 位程序加载到低内存地址中,这完全违背了将其设置为 64 位的意义。
然后您必须安排该库链接到 32 位 libc,但是在一个项目中包含两个 libc 可能会损坏。也许 32 位库可以使用 64 位 libc?但是,现在您需要担心的不仅仅是函数参数:系统类型的大小都是错误的。嗯,内核可能对来自 32 位和 64 位进程的系统调用做出不同的响应。不好。
(而且,我什至不确定是否可以在没有内核帮助的情况下在 32 位和 64 位 ISA 之间切换?)
不,我很确定这几乎是不可能的,没有人愿意做这项工作。而且,随着世界越来越 64 位和 32 位变得越来越少,越来越不有趣,这种情况变得不太可能改变,而不是更多。
IPC 选项听起来不太有趣。如果我是你,我会认真质疑为什么我的新项目必须是 64 位的。
【讨论】: