我有一个32位二进制C .so(由供应商提供)为Linux构建(使用gcc),我需要链接到64位C / C ++应用程序(我正在开发)。有没有办法从我的应用程序访问这个库?
我知道需要注意处理.so中函数的参数和指针,我知道很久以前它被认为基本上是不可能的(比如this post)。我希望情况有所改变。
答案 0 :(得分:3)
有可能将一些汇编程序粘合代码组合在一起以转换函数参数并将值从一个模块返回到另一个模块,并翻转处理器模式。有可能破解链接器,因此它不仅无法拒绝它(或者破解.so文件,因此链接器不知道)。你必须教64位动态链接器如何进行32位重定位,依此类推,然后开启,等等。
但是,当你在32位范围之外击中指针时会发生什么?那么,如果32位代码在64位地址加载会发生什么?现在必须教会内核在低内存地址中加载这个 64位程序,而这首先使得64位程序失败了。
然后你必须安排该库链接到32位libc,但在一个项目中有两个libc可能会被破坏。也许32位库可以使用64位libc?但是,现在这不仅仅是功能参数,你必须担心:系统类型的大小都是错误的。嗯,内核可能对32位和64位进程的系统调用做出不同的响应。不好。
(而且,我甚至不确定在没有内核帮助的情况下甚至可以在32位和64位ISA之间切换?)
不,我很确定这是不可能的,没人想做这项工作。而且,随着世界越来越多64位和32位越来越少,而且越来越不有趣,情况是更少可能会改变,而不是更多。
IPC选项听起来不是很有趣。如果我是你,我会认真质疑为什么我的新项目必须是64位。