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.   
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一切完美. :)