ld-linux.so 的库不对,请教高手有关动态库的兼容性问题

资料上说不兼容主要是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也得相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值