from http://blog.csdn.net/force_eagle/article/details/8684669

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

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

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

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

然后查看当前app引用了GLIBC_2.14中哪些函数

  1. # nm app |grep GLIBC_2.14
  2. ...
  3. U memcpy@@GLIBC_2.14
  4. ...

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

  1. # objdump -T app |grep GLIBC_2.14
  2. ...
  3. 0000000000000000      DF *UND*  0000000000000000  GLIBC_2.14  memcpy
  4. ...

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

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

获取libc.so实际路径.

  1. # gcc --print-file-name=libc.so
  2. /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
  3. # file /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
  4. /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so: ASCII text
  5. -bash-4.1# cat /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
  6. /* GNU ld script
  7. Use the shared library, but some functions are only in
  8. the static library, so try that secondarily.  */
  9. OUTPUT_FORMAT(elf64-x86-64)
  10. GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a  AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
  11. -bash-4.1# file /lib64/libc.so.6
  12. /lib64/libc.so.6: symbolic link to `libc-2.16.so'

获取memcpy版本信息.

  1. -bash-4.1# nm /lib64/libc-2.16.so |grep memcpy
  2. ...
  3. 000000000008a6d0 i memcpy@@GLIBC_2.14
  4. 0000000000084ab0 i memcpy@GLIBC_2.2.5
  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信息.

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

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

  1. # objdump -T app |grep memcpy
  2. 0000000000000000      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

version `GLIBC_2.14' not found 解决方法.的更多相关文章

  1. CentOS "libc.so.6: version 'GLIBC_2.14' not found"解决方法,同理'GLIBC_2.15' not found"

    出现"libc.so.6: version 'GLIBC_2.14' not found"问题,是由于glibc版本过低,升级glibc即可. 由于CentOS系统RPM源目前gl ...

  2. 【问题】CentOS6.5系统"libc.so.6: version 'GLIBC_2.15' not found"解决方法

    出现"libc.so.6: version 'GLIBC_2.15' not found"问题,是由于glibc版本过低,升级glibc即可. 由于CentOS系统RPM源目前gl ...

  3. 解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法

    glibc简介: glibc是GNU发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服 ...

  4. version `GLIBC_2.17' not found 解决方法

    1.先查看是哪个函数用的是GLIBC_2.17 root@emb-pc:/home/emb/temp# nm lib61850.so | grep GLIBC_2.17 U clock_gettime ...

  5. 解决libc.so.6: version `GLIBC_2.14' not found问题, 升级glibc,glibc-2.15

    0.以下在系统CentOS 6.3 x86_64上操作 1.试图运行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系统的g ...

  6. rhel 6 version `GLIBC_2.14' not found (required by /usr/lib64/libstdc++.so.6)以及libstdc++.so.6: version GLIBCXX_3.4.18 not found解决办法

    最近在oracle linux 7.3下开发了个应用,发布到rhel 6.5运行的时候,报version `GLIBC_2.14' not found (required by /usr/lib64/ ...

  7. 关于centos6版本执行程序报错:libc.so.6: version GLIBC_2.14 not found的解决

    执行后程序报错: libc.so.6: version GLIBC_2.14 not found 这种情况是因为当前服务器glibc的版本比较低造成的(不出意外是glibc_2.12是最高版本): 1 ...

  8. libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案

    线上一台服务器在执行leveldb程序的时候,报错:"libc.so.6: version `GLIBC_2.14' not found". 排查原因及解决方法如下: 1)产生原因 ...

  9. 执行SDK的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)

    问题| 执行SDK下的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)   ../ ...

随机推荐

  1. oracl 、mysql在线查看文档

    Oracle .mysql在线开发文档: http://www.runoob.com/sql/sql-union.html

  2. GNU与Linux

    GNU是自由软件之父 Richard Stallman在1984年组织开发的一个完全基于自由软件的软件体系,与此相应的有一分通用公共许可证(General Public License,简称GPL). ...

  3. 剑指offer(2) - 二维数组中的查找

    题目: 在一个二维数组中.每一行都依照从左到右递增的顺序排序,每一列都依照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,推断数组中是否含有该整数. 比如以下的二维数组就是每行.每列 ...

  4. 修复eclipse build-helper-maven-plugin 异常

    安装 help --> install new http://repo1.maven.org/maven2/.m2e/connectors/m2eclipse-buildhelper/0.15. ...

  5. java 调整jvm堆大小上限

    针对单个类,eclipse中调整jvm的运行参数,加上这么一句: -Xmx80m 即可把堆上限调整到80m. 关键字: BEA JRockit

  6. 用户研究Q&A(1)

    近来,不少同事开始认同用户研究的价值,希望通过接触,理解和研究用户来获取提升产品的有效信息.这绝对是件好事,因为我一直抱持的理念是,研究并不是藏在实验室或者握在少部分人手中的稀罕货,更重要是一种理念和 ...

  7. 如何高效的阅读hadoop源代码?

    个人谈谈阅读hadoop源代码的经验. 首先,不得不说,hadoop发展到现在这个阶段,代码已经变得非常庞大臃肿,如果你直接阅读最新版本的源代码,难度比较大,需要足够的耐心和时间,所以,如果你觉得认真 ...

  8. Android 5.0 + IDA 6.8 调试经验分享

    如今升级快.网上的资料仅仅能做參考. 学到了NDK逆向这一块,昨天为了能让IDA 能动态调试SO,瞎折腾了非常久,这里分享一下我的经验. 工具: IDA pro 6.8 Android 5.x IDA ...

  9. genymotion安装(unknown generic error)及配置在Android studio环境中

    /*转载请注明出处.本文地址:http://write.blog.csdn.net/postedit/44261371*/ genymotion模拟器的长处我就不阐述了,一个字:快!! .如今来说一下 ...

  10. 微信小程序调用后台接口+热点新闻滚动展示

    1.微信JS文件,发送请求调用:  //将返回接口数据,写入Page({data})里面 //获取热点新闻,这个也是写在onload:function(){//code)里面的 wx.request( ...