ciedecem 发表于 2012-12-28 18:32

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)了。


外面在下雪,出去透透气吧

linux_c_py_php 发表于 2012-12-29 19:35

编译的结果是为了变成机器指令, x86和x64的指令是不一样的.

liuiang 发表于 2012-12-29 21:40

ABI 和 数据模型 都不一样,怎么调用啊,试想一下,如果接口上传递了一个指针,会发生什么情况?

ciedecem 发表于 2012-12-29 23:42

回复 2# linux_c_py_php
那为什么32-bit的程序可以在64-bit的机器上运行却没有问题呢?? 指令是可以相互兼容的吧


   

ciedecem 发表于 2012-12-29 23:44

回复 1# ciedecem


    我觉得,问题可能出在连接器和加载器上, 或许是在SLF verison号的时候发现不一致,从而终止程序的。 我在看这方面,一旦有了结果,会及时update各位的
页: [1]
查看完整版本: C 程序 不同位长的动态库为什么不能相互调用?