GCC -m32标志:/usr/bin/ld:跳过不兼容的。

11

在64位主机上,我正在尝试使用-m32选项构建共享库。这些库是否可以与常规的64位库链接?

我正在做类似于以下的操作:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so

并且收到了像这样的错误信息:

/usr/bin/ld: skipping incompatible 64_bit_library.so

我的问题是:在64位操作系统上,应如何编译64_bit_library.so32_bit_library.so,以使32_bit_library.so可以连接到64_bit_library.so

1个回答

11

无法将32位应用程序与64位库进行链接,反之亦然。问题在于指针和类型通常不能在它们之间传递。通常的解决方法是生成另一大小的子进程,并使用IPC与该进程通信。

这样想:我有一个C语言的简单函数:

extern void foo(void*); 

如果它在一个64位库中,我尝试从一个32位库中调用它,那么指针的另一半从哪里来?

相反,如果它在一个32位库中,并且我从一个64位应用程序中调用它,那么指针的另一半会发生什么,因为我必须要丢失它才能调用它?


如果你非常小心,也许可以使用typedef、带有MAP_32BIT标志的mmap和共享内存段来玩一些游戏,但这是非常麻烦的! - Flexo
你能告诉我如何检查它是否不兼容吗?也许可以使用readelf?--http://rzr.online.fr/q/gcc - RzR
@rzr - 最简单的检查方法就是在共享对象上使用“file”命令,看它是否与您尝试使用gcc进行的操作相匹配。您也可以使用“readelf -h”或“objdump -x”等工具来解决问题,但我发现“file”的输出更为简洁。 - Flexo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接