当前位置:  技术问答>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
为什么含有库的名称呢?

|
先推荐阅读Program Library Howto(http://www.dwheeler.com/program-library/)
因为有许多不确定因素,因此,你自己给出的回答我觉得是最好的:)
1、用strace ./bash看看为什么出错。结构大小的改变、函数原型的不同等等都可能导致这个问题。
2、uclibc库里定义了FILE* __stdout,而标准libc库里没有。
3、库名是供动态连接使用的。但具体哪个符号属于哪个库,是没有的。
4、只产生调用代码。include也得相同。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教有关英文简历方面的词句!
  • 高分请教:请问怎么才能得到最近所有有关文件操作(新建,删除等)的记录
  • 有关"文件的权限变更"问题请教!!
  • 请教有关samba共享名大小写的问题
  • 请教一个有关JDBC连接方式的问题
  • 请教几个有关JAVA的英语单词!
  • 请教有关手机方面的问题
  • 请教有关命令行参数问题
  • 请教一个有关参数化类型的问题??
  • 请教:有关Java的数据计算的问题???
  • 请教有关jdk库的文档的问题
  • 请教有关自动ftp的问题!谢谢
  • 请教有关ssh登录问题
  • 请教有关konqueror 问题?
  • 请教有关显示器的问题!
  • 高分请教有关“负载平衡”的站点
  • 请教有关JBuilder的一个问题
  • 请教一个脚本执行的问题,有关权限的
  • 请教一个有关word的问题
  • 有关signal handler,请教!
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3