需要將一個(gè)jabber的客戶端porting到Atom的單板上,遇到的問題如下: - /lib/libc.so.6: version `GLIBC_2.15' not found (required by ./libevent_core-2.0.so.5)
初略分析: libevent_***.so.5是在虛擬機(jī)ubuntu12.04上編譯的,,所以glibc的版本比較高,,Atom的Image中g(shù)libc的版本比較低,; Google了一圈下來,大致有如下幾種解決方法: 1.采用低版本的Glibc重新編譯一下代碼,;(嘗試著在本地多裝一個(gè)Glibc版本,,未能成功,有機(jī)會(huì)可以再try一下,;另外裝了個(gè)fedora12,,該版本的Glibc版本與Atom板上接近,但是由于項(xiàng)目還依賴于一些高版本的軟件,,所以只得放棄) 2.采用全靜態(tài)方案編譯,;(網(wǎng)上不少人推崇這種方法,感覺比較坑爹,,項(xiàng)目畢竟不是helloworld,,不太好全靜態(tài)編譯,改了一天的Makefile,,最終以部分底層so,,需要挨個(gè)下源文件編譯而放棄) 3.指定Glibc的版本; 那么主要來介紹一下第三種方法,,步驟如下: 1.查看一下具體libevent_****.so.5,,是哪些部分調(diào)用到了GLIBC_2.15的libc.so.6 - objdump -x libevent_****.so |grep 2.15
- 0x06969195 0x00 06 GLIBC_2.15
- 00000000 F *UND* 00000000 __fdelt_chk@@GLIBC_2.15
通過objdump命令(由于是Atom,所以不需要交叉編譯,,如果是交叉編譯,,請注意選用相應(yīng)的編譯器的objdump),可以看出只調(diào)用了一個(gè)函數(shù)__fdel_chk,,這時(shí)去代碼里搜,,發(fā)現(xiàn)沒有該符號; 2.通過反匯編,查找相關(guān)的函數(shù)調(diào)用 - objdump -dS libevent_****.so >dump.txt
去dump.txt中搜索剛才的符號,,可以看到 - if (FD_ISSET(i, sop->event_writeset_out))
- 1e886: 89 44 24 3c mov %eax,0x3c(%esp)
- 1e88a: e8 d1 6c fe ff call 5560 __fdelt_chk@plt
其實(shí)__fdelt_chk,,是FD_ISSET調(diào)用的,由于FD_ISSET是宏,,所以之前搜索不到__fdelt_chk. 3.查看Atom單板的GLIBC版本信息 - /lib/libc.so.6
- GNU C Library development release version 2.11.90, by Roland McGrath et al.
- Copyright (C) 2009 Free Software Foundation, Inc.
- This is free software; see the sourcefor copying conditions.
- There is NO warranty;not even for MERCHANTABILITYor FITNESS FOR A
- PARTICULAR PURPOSE.
- Compiled by GNU CC version 4.5.1.
- Compiled on a Linux >>2.6.27.41-170.2.117.fc10.i686<< system on 2012-04-17.
- Available extensions:
- crypt add-on version 2.1 by Michael Gladand others
- Native POSIX Threads Library by Ulrich Drepper et al
- BIND-8.2.3-T5B
- For bug reporting instructions, please see:
- <http://www.gnu.org/software/libc/bugs.html>
4.在調(diào)用了FD_ISSET的C代碼中,,指定相應(yīng)的符號鏈接Atom單板的GLIBC版本的符號表 - __asm__('.symver __fdelt_chk,__fdelt_chk@GLIBC_2.11')
5.重新編譯代碼,代碼可以成功運(yùn)行在Atom單板和PC上. 轉(zhuǎn)載請保留地址:http://blog./uid-13909379-id-3432236.html 參考鏈接: http://www./blog/?p=103 ================================================== #include #include #include __asm__('.symver realpath,realpath@GLIBC_2.2.5');int main(){ char* unresolved = '/lib64'; char resolved[PATH_MAX+1]; if(!realpath(unresolved, resolved)) { return 1; } printf('%s\n', resolved); return 0;}
|