Linux下可执行代码的依赖性,以及一个问题的解决

近日为他人写了个Linux下的动态链接库,在Ubuntu 9.04下编译成功,试运行也正常,但是到了目标环境那里,总是报错:

libc.so.6: Version 'GLIBC_2.4' not found (required by ......)

 

分析过程:

  • 动态链接库使用者用find 在目标环境查找, libc.so.6存在并且在LD_LIBRARY_PATH中。
  • 在编译环境直接执行libc.so.6,发现其版本是2.9
  • 用 ldd 查看其依赖性:ldd <我的动态链接库>
     linux-gate.so.1 =>  (0xb7fee000)
     libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e79000)
     /lib/ld-linux.so.2 (0xb7fef000)
  • 使用gcc -static 编译,再用ldd查看,还是依赖于 libc.so.6,难道 目标是 .so的情况下,-static不起作用?
  • 使用 nm查看其符号表:nm <我的动态链接库> | grep U (过滤库中未定义的符号),得到
             U __stack_chk_fail@@GLIBC_2.4
             U localtime@@GLIBC_2.0
             U memchr@@GLIBC_2.0
             U memcmp@@GLIBC_2.0
             U memcpy@@GLIBC_2.0
             U memmove@@GLIBC_2.0
             U memset@@GLIBC_2.0
             U sprintf@@GLIBC_2.0
             U strchr@@GLIBC_2.0
             U strcpy@@GLIBC_2.0
             U strlen@@GLIBC_2.0
             U strncpy@@GLIBC_2.0
             U time@@GLIBC_2.0
    原来只有这个 __stack_chk_fail 依赖于 2.4版,其他均依赖于2.0版。于是想办法去掉这个依赖。
  • 搜索发现 gcc 4.2之后对某些情况加入stack检查,可以用gcc参数 -fno-stack-protector关掉这个检查。加入此选项重新编译之后,再用nm检查,果然少了对__stack_chk_fail@@GLIBC_2.4的依赖。

于是问题解决。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值