from http://blog.csdn.net/force_eagle/article/details/8684669html
version `GLIBC_2.14' not found 解決方法.node
通常出現相似次問題是當前運行系統Glibc版本低於編譯環境Glibc版本形成Glibc版本兼容性形成的.
一般可使用-static連接成靜態程序便可解決.
不過通過google大神發現還有另一種方法能夠在使用動態庫的環境下規避此類問題.
首先查看APP Glibc 兼容性.看當前app使用了哪些Glibc版本.linux
- # 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中哪些函數web
- # nm app |grep GLIBC_2.14
- ...
- U memcpy@@GLIBC_2.14
- ...
也可使用 objdump 查看app動態引用符號表.sql
- # 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實際路徑.bash
- # 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版本信息.app
- -bash-4.1# nm /lib64/libc-2.16.so |grep memcpy
- ...
- 000000000008a6d0 i memcpy@@GLIBC_2.14
- 0000000000084ab0 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信息.oop
- #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支持.ui
- # objdump -T app |grep memcpy
- 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