打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
version `GLIBC

version `GLIBC_2.14' not found 解决方法.

一般出现类似次问题是当前运行系统Glibc版本低于编译环境Glibc版本造成Glibc版本兼容性造成的.  
通常可以使用-static链接成静态程序即可解决.
不过经过google大神发现还有另外一种方法可以在使用动态库的环境下规避此类问题.

首先查看APP Glibc 兼容性.看当前app使用了哪些Glibc版本.

# objdump -p app...Version References: required from libc.so.6: 0x06969194 0x00 05 GLIBC_2.14 0x0d696913 0x00 04 GLIBC_2.3 0x0d696914 0x00 03 GLIBC_2.4 0x09691a75 0x00 02 GLIBC_2.2.5

然后查看当前app引用了GLIBC_2.14中哪些函数
# nm app |grep GLIBC_2.14...U memcpy@@GLIBC_2.14...


也可以使用 objdump 查看app动态引用符号表.

# objdump -T app |grep GLIBC_2.14...0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy...


上例显示app引用 2.14 版本中的memcpy函数. 
下面将用到 gcc 的一个特性实际上是ld的特性.可以将引用符号绑定到一个特定版本.只需在.c文件中写入类似代码.
__asm__('.symver original_foo,foo@VERS_1.1');
即可.


查找当前系统glibc版本中memcpy的各个版本.


获取libc.so实际路径.
# gcc --print-file-name=libc.so/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so# file /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so: ASCII text-bash-4.1# cat /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */OUTPUT_FORMAT(elf64-x86-64)GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )-bash-4.1# file /lib64/libc.so.6/lib64/libc.so.6: symbolic link to `libc-2.16.so'


获取memcpy版本信息.
-bash-4.1# nm /lib64/libc-2.16.so |grep memcpy...000000000008a6d0 i memcpy@@GLIBC_2.140000000000084ab0 i memcpy@GLIBC_2.2.5...

可以看出memcpy最低版本是('@GLIBC_2.2.5')2.2.5,而默认使用版本是2.14('@@GLIBC_2.14') 这里我们只要将 glibc 2.14 版本memcpy降到glibc 2.2.5. 在源代码写入以下代码
__asm__('.symver memcpy,memcpy@GLIBC_2.2.5');
重新编译.

再次查看app信息.

#objdump -p app...Version References: required from libc.so.6: 0x0d696913 0x00 04 GLIBC_2.3 0x0d696914 0x00 03 GLIBC_2.4 0x09691a75 0x00 02 GLIBC_2.2.5


发现当前版本需求已不再需要glibc 2.14支持.

# objdump -T app |grep memcpy0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memcpy


memcpy已完全修改为Glibc 2.2.5支持.


至此完美解决. 再次运行app一切完美. :)


参考:

http://www.trevorpounds.com/blog/?p=103

http://www.trevorpounds.com/blog/?tag=symbol-versioning

http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html

http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/Linker.pdf

http://www.technovelty.org/c/symbol-versions-and-dependencies.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于 gcc 中遇到的问题,这里有你想要的全部答案
Linux 修改 ELF 解决 glibc 兼容性问题
覆盖GNU C库中调试glibc函数
ldd(ldd命令)
OBJ文件格式分析工具: objdump, nm,ar
使用gdbserver调试arm程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服