近日为他人写了个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的依赖。
于是问题解决。