2

我有一个为 Linux(使用 gcc)构建的 32 位纯二进制 C .so(由供应商提供),我需要链接到 64 位 C/C++ 应用程序(我正在开发)。有没有办法从我的应用程序访问这个库?

我知道需要注意处理 .so 中的参数和指向函数的指针,而且我知道很久以前它被认为基本上是不可能的(就像这篇文章一样)。我希望情况已经改变。

4

1 回答 1

3

有可能将一些汇编胶水代码组合在一起,以将函数参数和返回值从一个模块转换到另一个模块,并翻转处理器模式。可能会破解链接器,因此它不仅会立即拒绝它(或破解 .so 文件,因此链接器不知道)。而且您必须教 64 位动态链接器如何进行 32 位重定位,等等等等。

但是,当您点击 32 位范围之外的指针时会发生什么?说到这里,如果 32 位代码加载到 64 位地址会发生什么?现在必须教内核将这个64 位程序加载到低内存地址中,这完全违背了将其设置为 64 位的意义。

然后您必须安排该库链接到 32 位 libc,但是在一个项目中包含两个 libc 可能会损坏。也许 32 位库可以使用 64 位 libc?但是,现在您需要担心的不仅仅是函数参数:系统类型的大小都是错误的。嗯,内核可能对来自 32 位和 64 位进程的系统调用做出不同的响应。不好。

(而且,我什至不确定是否可以在没有内核帮助的情况下在 32 位和 64 位 ISA 之间切换?)

不,我很确定这几乎是不可能的,没有人愿意做这项工作。而且,随着世界越来越 64 位和 32 位变得越来越少,越来越不有趣,情况变得越来越不可能改变,而不是更多。

IPC 选项听起来不太有趣。如果我是你,我会认真质疑为什么我的新项目必须是 64 位的。

于 2013-10-16T14:24:42.300 回答