錯誤:/lib64/libc.so.6: version `GLIBC_2.14’ not found解決辦法

不管你是用annoy還是用tensorflow缸血,用pip安裝后嗜历,然后import的時候會產(chǎn)生類似以下的異常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/users/kinva/tools/lib/python2.7/site-packages/annoy/__init__.py", line 15, in <module>
    from .annoylib import *
ImportError: /lib64/tls/libc.so.6: version `GLIBC_2.14' not found (required by /home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so)
# 如果是TF就是lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so

優(yōu)先嘗試這種方法:
python錯誤:/lib64/libc.so.6: version `GLIBC_2.14’ not found解決辦法

我在這個問題上卡了很久巡揍,也查找了很多資料舷手,都不能圓滿解決glibc依賴的問題煞赢,連重新編譯libc-2.14都試過了啦辐。
后來偶然發(fā)現(xiàn)了這篇文文章:Running new applications on old glibc 參考這篇文章的思路雹拄,這個問題才得以圓滿解決(感謝文章的作者耙册,同時感謝公司內(nèi)部資料)槽袄,下面根據(jù)這篇文章的思路來闡述如何逐步解決annoy或者tf依賴glibc的問題烙无。

解決方案

解決方法主要包括兩部分內(nèi)容:

  • 減弱版本依賴以便在程序在啟動的時候不被動態(tài)連接器終止
  • 提供缺失的依賴函數(shù)(由最新的glibc版本提供)

下面以annoy為例,TF類似的遍尺,自己替換文件路徑即可

查看依賴

錯誤是由/home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so這個動態(tài)連接庫引起的截酷,那看一看這個so里到底哪部分依賴了glibc2.14。

# readelf -s 文件路徑|grep GLIBC_2.14
readelf -s /home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so | grep GLIBC_2.14

輸出如下:

108: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.14 (7)
180: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@@GLIBC_2.14

我們看到依賴了2.14的memcpy函數(shù)乾戏。

再來看一看annoylib.so中依賴的glibc版本信息迂苛,執(zhí)行:

# readelf -V 文件路徑
readelf -V /home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so

輸出:


readelf1.png

可以看出在地址偏移量0x0050處,是glibc_2.14的標記地址鼓择,問題的關(guān)鍵是如何減弱這個版本依賴三幻。
其思路就是想辦法讓這個glibc_2.14這個版本依賴變成可選而非強制性的。

更改glic_2.14依賴

  • 圖中.gpu.version_r 的地址起始位置在文件偏移量0x002288處
  • glibc_2.14版本標記地址偏移量是0x0050,在文件地址偏移量的(0x002288+0x0050)
  • 指向0x0090偏移量的位置存放的是結(jié)構(gòu)體Elfxx_Vernaux


    glibc1.png
  • vna_flags 是依賴信息呐能,在結(jié)構(gòu)體的第二個位置念搬,ELFxx_Word是32bit抑堡,也就是4B,因此vna_flag的起始地址偏移量是0x04

通常Flags:none在二進制位置的值是0x0000朗徊,根據(jù)上述分析首妖,為了能減弱glibc_2.14的版本依賴,需要在(0x002288+0x0050+0x04)處填充0x02(對應VER_FLG_WEAK)

因此執(zhí)行:

# 要養(yǎng)成習慣爷恳,更改文件的時候有缆,一定要備份
cp /home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so annoylib.so
# 更改為弱依賴
# 其中0x22dc需要自己計算0x002288+0x0050+0x04
# 這里替換2個地方,一個是地址温亲,一個是文件路徑棚壁,其他保持不變。
for addr in 0x22dc; do printf '\x02' | dd conv=notrunc of=/home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so  bs=1 seek=$((addr)) ; done

執(zhí)行完了铸豁,我們驗證效果:

# readelf -V 文件路徑
readelf -V /home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so
readelf2.png

看到2.14版本依賴已經(jīng)變成weak了灌曙。成功了一半。

實現(xiàn)缺失的函數(shù)

接下來需要解決缺失的memcpy函數(shù)节芥,最簡單的方式是生成一個本地的動態(tài)庫來實現(xiàn)缺失的函數(shù),并在執(zhí)行程序之前使用LD_PRELOAD去load這個動態(tài)庫逆害。
針對上文中指出的缺失的memcpy函數(shù)头镊,如果查看實際的glibc_2.14實現(xiàn)的memcpy函數(shù)就會發(fā)現(xiàn),其實際上和memmove相同魄幕,這樣我們可以自己實現(xiàn)這個函數(shù)(mylibc.so):

#include <string.h>
void* memcpy(void *dest, const void *src, size_t n) {
    return memmove(dest, src, n);
}

執(zhí)行以下命令編譯成so

gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c

得到mylibc.so共享庫
接下來就是鏈接動態(tài)庫就好了相艇。

  • 可以拷貝so到已經(jīng)在引入的路徑,如我的/home/users/kinva/tools/lib
  • 或者 export LD_LIBRARY_PATH=/home/users/kinva/tools/mylib:$LD_LIBRARY_PATH

再次執(zhí)行:

[kinva@MacBook-Pro ~]$ python
Python 2.7.3 (default, Jan 24 2017, 17:03:37) 
[GCC 3.4.5 20051201 (Red Hat 3.4.5-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import annoy
>>> 

其他問題

如果還是繼續(xù)報錯纯陨,請注意報的so已經(jīng)不一樣了坛芽,把每一個so的問題都解決。
如果你依賴的gcc是4.8+翼抠,請用4.6版本咙轩,否則你要擁有root權(quán)限。

TF需要更改的文件:
_pywrap_tensorflow.so
libstdc++.so.6(root權(quán)限)
librt.so.1
_sparse_feature_cross_op.so
_bucketization_op.so
_set_ops.so
_lstm_ops.so
_sdca_ops.so
需要實現(xiàn)的so有:mylibc.so和mygettime.so
memcpy和gettime相關(guān)阴颖,可以查查別的資料這個實現(xiàn)很簡單的活喊,我就不寫了。

建議

這個東西根本原因就是系統(tǒng)版本庫太老量愧,如果更新glibc將會引起系統(tǒng)不穩(wěn)定钾菊,所以建議還是升級系統(tǒng)吧。如果是centos偎肃,建議用6u3及以上版本煞烫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市累颂,隨后出現(xiàn)的幾起案子滞详,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茵宪,死亡現(xiàn)場離奇詭異最冰,居然都是意外死亡,警方通過查閱死者的電腦和手機稀火,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門暖哨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凰狞,你說我怎么就攤上這事篇裁。” “怎么了赡若?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵达布,是天一觀的道長。 經(jīng)常有香客問我逾冬,道長黍聂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任身腻,我火速辦了婚禮产还,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘀趟。我一直安慰自己脐区,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布她按。 她就那樣靜靜地躺著牛隅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酌泰。 梳的紋絲不亂的頭發(fā)上媒佣,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音宫莱,去河邊找鬼丈攒。 笑死,一個胖子當著我的面吹牛授霸,可吹牛的內(nèi)容都是我干的巡验。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼碘耳,長吁一口氣:“原來是場噩夢啊……” “哼显设!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辛辨,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤捕捂,失蹤者是張志新(化名)和其女友劉穎瑟枫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體指攒,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡慷妙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了允悦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝擂。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隙弛,靈堂內(nèi)的尸體忽然破棺而出架馋,到底是詐尸還是另有隱情,我是刑警寧澤全闷,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布叉寂,位于F島的核電站,受9級特大地震影響总珠,放射性物質(zhì)發(fā)生泄漏屏鳍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一姚淆、第九天 我趴在偏房一處隱蔽的房頂上張望孕蝉。 院中可真熱鬧,春花似錦腌逢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霍殴,卻和暖如春媒惕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背来庭。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工妒蔚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人月弛。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓肴盏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帽衙。 傳聞我的和親對象是個殘疾皇子菜皂,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容