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


    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版本.

    [plain] view plaincopy
    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中哪些函数

    [plain] view plaincopy
    1. # nm app |grep GLIBC_2.14  
    2. ...  
    3. U memcpy@@GLIBC_2.14  
    4. ...  



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

    [plain] view plaincopy
    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实际路径.

    [plain] view plaincopy
    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版本信息.

    [plain] view plaincopy
    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信息.

    [plain] view plaincopy
    1. #objdump -p app  
    2. ...  
    3.   
    4.   
    5. Version References:  
    6.   required from libc.so.6:  
    7.     0x0d696913 0x00 04 GLIBC_2.3  
    8.     0x0d696914 0x00 03 GLIBC_2.4  
    9.     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

  • 相关阅读:
    Webstorm 9.0.3 注册码
    css去掉iPhone、iPad的默认按钮样式只需要一行样式就可以搞定
    手机下拉加载
    webpack vuejs项目学习心得
    nodejs常用模块之url
    jquery ajax详解
    iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
    使用StoryBoard设置Scrollview的横向滚动不用一行代码
    iOS 创建上线证书
    CoreData多表操作.
  • 原文地址:https://www.cnblogs.com/little-ant/p/4092767.html
Copyright © 2020-2023  润新知