C 程序 不同位长的动态库为什么不能相互调用?
1. 用32为的main函数调用64位的动态库, 失败了
>gcc -m32 -L/usr/lib/ -lslave main.c
>file /usr/lib/libslave.so
64-bit
>a.out
error while loading shared libraries:libslave.so: cannot open shared object file: No such file or directory.
2. 用64为的main函数调用32位的动态库,连编译也没有过!!!
>file /usr/lib/libslave.so
32-bit
>gcc -m64 -L/usr/lib/ -lslave main.c
/usr/bin/ld: skipping incompatible ./libslave.so when searching for -lslave.
这个问题是在把在jdk 6(32-bit)的JNI 程序移植到JDK(64-bit)时遇到的, java程序不用重新编译,可以直接运行,但是它调用的32-bit的c动态库就不行了。
我隐约地感到,或许是“字节对齐”吧? 但不又说不上来。 现在能做做的只能是将c动态库 重新编译(加上 -m64)了。
外面在下雪,出去透透气吧 编译的结果是为了变成机器指令, x86和x64的指令是不一样的. ABI 和 数据模型 都不一样,怎么调用啊,试想一下,如果接口上传递了一个指针,会发生什么情况? 回复 2# linux_c_py_php
那为什么32-bit的程序可以在64-bit的机器上运行却没有问题呢?? 指令是可以相互兼容的吧
回复 1# ciedecem
我觉得,问题可能出在连接器和加载器上, 或许是在SLF verison号的时候发现不一致,从而终止程序的。 我在看这方面,一旦有了结果,会及时update各位的
页:
[1]