当前位置: 技术问答>linux和unix
请教高手有关动态库的兼容性问题
来源: 互联网 发布时间:2015-11-18
本文导语: 资料上说不兼容主要是API接口不同。 我做了如下试验: 用uClibc编译了bash 在uClibc环境下运行正常。 现在拷到普通环境下(正常安装的Redhat)作如下试验: 1:试验ld-uClibc.so与其他库的lib的兼容性。这个实验中使用uCLibc的...
资料上说不兼容主要是API接口不同。
我做了如下试验:
用uClibc编译了bash
在uClibc环境下运行正常。
现在拷到普通环境下(正常安装的Redhat)作如下试验:
1:试验ld-uClibc.so与其他库的lib的兼容性。这个实验中使用uCLibc的ld装载了GLibc的库和uClibc的库,还存在uClibc的库和Glibc的库同时工作的问题
#./bash
-bash: ./bash: /lib/ld-uClibc.so.0: bad ELF interpreter: No such file or directory
#cp ../lib/ld-uClibc.so.0 /lib
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0xb7fad000)
libdl.so.0 => not found
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7fa1000)
libc.so.0 => not found
libc.so.6 => /lib/libc.so.6 (0xb7e76000)
ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7e53000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xd65000)
# cp ../lib/libdl.so.0 ../lib/libc.so.0 /lib
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0xb7fad000)
libdl.so.0 => /lib/libdl.so.0 (0xb7fa9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7f9d000)
libc.so.0 => /lib/libc.so.0 (0xb7f58000)
libc.so.6 => /lib/libc.so.6 (0xb7e2d000)
ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7e0a000)# ./bash
# ./bash
Segmentation fault
2:试应用程序与其他动态库的兼容性(不是编译时使用的库)
还是1开始时的环境:
# ./bash
-bash: ./bash: /lib/ld-uClibc.so.0: bad ELF interpreter: No such file or directory
# cp /lib/ld-linux.so.2 /lib/ld-uClibc.so.0
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x00d87000)
libdl.so.0 => not found
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00dd4000)
libc.so.0 => not found
libc.so.6 => /lib/tls/libc.so.6 (0x00bf5000)
/lib/ld-uClibc.so.0 (0x00bdc000)
# cp /lib/libdl.so.2 /lib/libdl.so.0
# cp /lib/libdl.so.2 /lib/libdl.so.0
# cp /lib/libc.so.6 /lib/libc.so.0
# ./bash
./bash: symbol lookup error: ./bash: undefined symbol: __stdout
对于这两个问题,请不要给出“不同库肯定不能共用,不同版本不能兼容,不能这样用cp来更换版本”之类的回答。我不明白的是为什么会这样。
还有一个问题:
linux中据说应用程序仅仅给出函数名,没有说明在那个库里。查找函数在哪个库以及加载这个库是ld的工作。那么:
# readelf -a ./bash | grep lib
[Requesting program interpreter: /lib/ld-uClibc.so.0]
0x00000001 (NEEDED) Shared library: [libncurses.so.5]
0x00000001 (NEEDED) Shared library: [libdl.so.0]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.0]
080bd6d8 00036c07 R_386_JUMP_SLOT 00000000 _stdlib_mb_cur_max
080bd740 00048007 R_386_JUMP_SLOT 00000000 __uClibc_main
563: 080bf494 4 OBJECT GLOBAL DEFAULT 21 rl_library_version
876: 00000000 10 FUNC GLOBAL DEFAULT UND _stdlib_mb_cur_max
1152: 00000000 345 FUNC GLOBAL DEFAULT UND __uClibc_main
000000: Version: 1 File: libgcc_s.so.1 Cnt: 1
# strings ./bash | grep lib
/lib/ld-uClibc.so.0
libncurses.so.5
libdl.so.0
libgcc_s.so.1
libc.so.0
_stdlib_mb_cur_max
__uClibc_main
rl_library_version
/usr/local/lib/bashdb/bashdb-main.inc
为什么含有库的名称呢?
我做了如下试验:
用uClibc编译了bash
在uClibc环境下运行正常。
现在拷到普通环境下(正常安装的Redhat)作如下试验:
1:试验ld-uClibc.so与其他库的lib的兼容性。这个实验中使用uCLibc的ld装载了GLibc的库和uClibc的库,还存在uClibc的库和Glibc的库同时工作的问题
#./bash
-bash: ./bash: /lib/ld-uClibc.so.0: bad ELF interpreter: No such file or directory
#cp ../lib/ld-uClibc.so.0 /lib
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0xb7fad000)
libdl.so.0 => not found
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7fa1000)
libc.so.0 => not found
libc.so.6 => /lib/libc.so.6 (0xb7e76000)
ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7e53000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xd65000)
# cp ../lib/libdl.so.0 ../lib/libc.so.0 /lib
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0xb7fad000)
libdl.so.0 => /lib/libdl.so.0 (0xb7fa9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7f9d000)
libc.so.0 => /lib/libc.so.0 (0xb7f58000)
libc.so.6 => /lib/libc.so.6 (0xb7e2d000)
ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7e0a000)# ./bash
# ./bash
Segmentation fault
2:试应用程序与其他动态库的兼容性(不是编译时使用的库)
还是1开始时的环境:
# ./bash
-bash: ./bash: /lib/ld-uClibc.so.0: bad ELF interpreter: No such file or directory
# cp /lib/ld-linux.so.2 /lib/ld-uClibc.so.0
# ldd ./bash
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x00d87000)
libdl.so.0 => not found
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00dd4000)
libc.so.0 => not found
libc.so.6 => /lib/tls/libc.so.6 (0x00bf5000)
/lib/ld-uClibc.so.0 (0x00bdc000)
# cp /lib/libdl.so.2 /lib/libdl.so.0
# cp /lib/libdl.so.2 /lib/libdl.so.0
# cp /lib/libc.so.6 /lib/libc.so.0
# ./bash
./bash: symbol lookup error: ./bash: undefined symbol: __stdout
对于这两个问题,请不要给出“不同库肯定不能共用,不同版本不能兼容,不能这样用cp来更换版本”之类的回答。我不明白的是为什么会这样。
还有一个问题:
linux中据说应用程序仅仅给出函数名,没有说明在那个库里。查找函数在哪个库以及加载这个库是ld的工作。那么:
# readelf -a ./bash | grep lib
[Requesting program interpreter: /lib/ld-uClibc.so.0]
0x00000001 (NEEDED) Shared library: [libncurses.so.5]
0x00000001 (NEEDED) Shared library: [libdl.so.0]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.0]
080bd6d8 00036c07 R_386_JUMP_SLOT 00000000 _stdlib_mb_cur_max
080bd740 00048007 R_386_JUMP_SLOT 00000000 __uClibc_main
563: 080bf494 4 OBJECT GLOBAL DEFAULT 21 rl_library_version
876: 00000000 10 FUNC GLOBAL DEFAULT UND _stdlib_mb_cur_max
1152: 00000000 345 FUNC GLOBAL DEFAULT UND __uClibc_main
000000: Version: 1 File: libgcc_s.so.1 Cnt: 1
# strings ./bash | grep lib
/lib/ld-uClibc.so.0
libncurses.so.5
libdl.so.0
libgcc_s.so.1
libc.so.0
_stdlib_mb_cur_max
__uClibc_main
rl_library_version
/usr/local/lib/bashdb/bashdb-main.inc
为什么含有库的名称呢?
|
先推荐阅读Program Library Howto(http://www.dwheeler.com/program-library/)
因为有许多不确定因素,因此,你自己给出的回答我觉得是最好的:)
1、用strace ./bash看看为什么出错。结构大小的改变、函数原型的不同等等都可能导致这个问题。
2、uclibc库里定义了FILE* __stdout,而标准libc库里没有。
3、库名是供动态连接使用的。但具体哪个符号属于哪个库,是没有的。
4、只产生调用代码。include也得相同。
因为有许多不确定因素,因此,你自己给出的回答我觉得是最好的:)
1、用strace ./bash看看为什么出错。结构大小的改变、函数原型的不同等等都可能导致这个问题。
2、uclibc库里定义了FILE* __stdout,而标准libc库里没有。
3、库名是供动态连接使用的。但具体哪个符号属于哪个库,是没有的。
4、只产生调用代码。include也得相同。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。