1. 程式人生 > >使用ltp編譯出來的cws_cmdline,cp到其他機器上執行報錯:/lib64/libc.so.6: version `GLIBC_2.14′ not found

使用ltp編譯出來的cws_cmdline,cp到其他機器上執行報錯:/lib64/libc.so.6: version `GLIBC_2.14′ not found

這主要是由於編譯環境的glibc的版本高於執行時的glibc版本導致。

解決辦法:升級glibc

具體參考:

http://qinghua.blog.51cto.com/202629/1706585

為防止連結失效,黏貼如下:

在系統CentOS release 6.4 (Final)  x86_64上操作

1.試圖執行程式

提示”libc.so.6: version `GLIBC_2.14′ not found”,原因是系統的glibc版本太低,軟體編譯時使用了較高版本的glibc引起的.

2.檢視系統glibc支援的版本

strings /lib64/libc.so.6 |grep GLIBC_

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

[[email protected] work]# strings /lib64/libc.so.6 |grep GLIBC_

GLIBC_2.2.5

GLIBC_2.2.6

GLIBC_2.3

GLIBC_2.3.2

GLIBC_2.3.3

GLIBC_2.3.4

GLIBC_2.4

GLIBC_2.5

GLIBC_2.6

GLIBC_2.7

GLIBC_2.8

GLIBC_2.9

GLIBC_2.10

GLIBC_2.11

GLIBC_2.12

GLIBC_PRIVATE

 rpm -qa |grep glibc

1

2

3

4

5

6

7

8

[[email protected] work]# rpm -qa |grep glibc

compat-glibc-headers-2.5-46.2.x86_64

glibc-common-2.12-1.107.el6.x86_64

glibc-devel-2.12-1.107.el6.x86_64

glibc-2.12-1.107.el6.i686

compat-glibc-2.5-46.2.x86_64

glibc-2.12-1.107.el6.x86_64

glibc-headers-2.12-1.107.el6.x86_64

3.可以看到最高只支援2.12版本,所以考慮編譯解決這個問題

2).這裡解壓到 /opt/glibc-2.14

3).新建目錄 /opt/glibc-2.14-install ,並cd進入此目錄:

mkdir  /opt/glibc-2.14-install

cd /opt/glibc-2.14-install

4). 新建安裝目錄 /opt/glibc-2.14-build

mkdir /opt/glibc-2.14-build

並執行configure配置,make && sudo  make install

 cd /opt/glibc-2.14-install 目錄下,執行 

/opt/glibc-2.14/configure –prefix=/opt/glibc-2.14-build/

make -j4

make install

4. 臨時修改環境變數

export LD_LIBRARY_PATH=/opt/glibc-2.14-build/lib:$LD_LIBRARY_PATH  

注意:  glibc-2.14-build 是安裝目錄

———————–

version `GLIBC_2.14′ not found 解決方法

一般出現類似次問題是當前執行系統Glibc版本低於編譯環境Glibc版本造成Glibc版本相容性造成的.  
通常可以使用-static連結成靜態程式即可解決.
不過經過google大神發現還有另外一種方法可以在使用動態庫的環境下規避此類問題.

首先檢視APP Glibc 相容性.看當前app使用了哪些Glibc版本.

objdump -p libalgrms.so

1

2

3

4

5

6

7

8

9

10

11

[[email protected] lib]# objdump -p libalgrms.so

libalgrms.so:     file format elf64-x86-64

.....

Version References:

required from libc.so.6:

0x06969194 0x00 04 GLIBC_2.14

0x0d696914 0x00 03 GLIBC_2.4

0x09691a75 0x00 02 GLIBC_2.2.5



然後檢視當前app引用了GLIBC_2.14中哪些函式

nm libalgrms.so | grep GLIBC_2.14

1

2

[[email protected] lib]# nm libalgrms.so | grep GLIBC_2.14

U [email protected]@GLIBC_2.14


也可以使用 objdump 檢視app動態引用符號表.

objdump -T libalgrms.so | grep GLIBC_2.14

[[email protected] lib]# objdump -T libalgrms.so | grep GLIBC_2.14  
0000000000000000      DF *UND*    0000000000000000  GLIBC_2.14  memcpy


上例顯示app引用 2.14 版本中的memcpy函式. 
下面將用到 gcc 的一個特性實際上是ld的特性.可以將引用符號繫結到一個特定版本.只需在.c檔案中寫入類似程式碼.
__asm__(“.symver original_foo,[email protected]_1.1″);
即可.





查詢當前系統glibc版本中memcpy的各個版本.

獲取libc.so實際路徑.

1

2

3

4

5

6

7

8

9

10

11

12

# 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版本資訊.

1

2

3

4

5

-bash-4.1# nm /lib64/libc-2.16.so |grep memcpy 

... 

000000000008a6d0 i [email protected]@GLIBC_2.14 

0000000000084ab0 i [email protected]_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,[email protected]_2.2.5″);
重新編譯.

再次檢視app資訊.

1

2

3

4

5

6

7

8

9

#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支援.

1

2

# objdump -T app |grep memcpy 

0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memcpy

memcpy已完全修改為Glibc 2.2.5支援.
 

至此完美解決. 再次執行一切完美


相關推薦

使用ltp編譯出來cws_cmdlinecp其他機器執行/lib64/libc.so.6: version `GLIBC_2.14not found

這主要是由於編譯環境的glibc的版本高於執行時的glibc版本導致。 解決辦法:升級glibc 具體參考: http://qinghua.blog.51cto.com/202629/1706585 為防止連結失效,黏貼如下: 在系統CentOS release 6.4

在按照ROS官方步驟操作同時用Git管理整個過程git clone的新catkin_ws catkin_package() include dir 'include' does not exist relative to

RR make one ack body mes error AR gpo 在按照ROS官方步驟操作,同時用Git管理整個過程,git clone的新catkin_ws報錯如下: CMake Error at /opt/ros/kinetic/share/catkin/c

windows寫的指令碼結果到linux執行

原因: 出現這種錯誤的原因是因為:CR/LF問題,在dos/window下按一次回車鍵實際上輸入的是“回車(CR)”和“換行(LF)”,而Linux/unix下按一次回車鍵只輸入“換行(LF)”,所以

vs2013編譯的程式在其他機器執行的環境設定

vs2013編譯的程式在其他沒有安裝vs2013的機器上執行會有問題,網上有很多解決方法,如果你還沒有解決,可以嘗試以下方法,這是我在反覆崩潰,煩躁測試後得到的解決方法。 1. 安裝vs2013 執行包 vcredist_x64.exe 如果這個時候還是不能正常執行,請不要

使用exe4j將jar包生可執行的.exe檔案(加入jre依賴環境)可在其他機器執行

首先,在任意目錄建立一個資料夾,最好命名和專案名相同,我在E盤建立了一個“DataStructure”資料夾,之後將所有的資原始檔以及我們生成的可執行jar檔案(我的DataStructure.ja

解決CENTOS7 通過虛擬機器複製後網路無法開啟RTNETLINK answers: File exists或no suitable device found for this connect

最近需要用到CENTOS7來部署hadoop 與spark 叢集,製作了模板的centos後,複製到新的機器 上網路無法啟動。 報錯:RTNETLINK answers: File exists或no suitable device found for this conne

VS2013生成Release版本MFC程式在其他機器執行

對於自己機器安裝了VS開發環境,生成MFC的exe檔案能夠在自己機器上執行,複製到其他目標機器可能出現不能執行的情況。下面就個人經歷將釋出的兩中情況簡要說明。 1、工程屬性中:配置屬性-常規,MFC使用型別選擇“在共享的DLL中使用MFC”;C/C++ -

VC編寫的程式不能在其他機器執行的解決方案

你需要確定Microsoft.VC90.DebugCRT資料夾裡面的Microsoft.VC90.DebugCRT.manifest檔案裡面儲存的版本資訊而你程式依賴的版本資訊匹配,Microsoft.VC90.DebugCRT.manifest裡面的版本資訊大版本號一定要一致,小版本號一定要等於或者大於你程

專案編譯不通過import org.apache.http.HttpResponse;

專案編譯不通過 檢查: 一、當前專案使用的sdk 版本,是否下載了。 右擊專案—— properties——android ——project build target   選擇一個本地下載好的sdk 版本。比如選擇Android 6.0 - 23。 二、修改 Andro

qt5+vs2017程式打包釋出其他電腦執行

最近剛剛接觸qt5編寫介面程式,新手上路可謂是困難重重啊,你永遠不知道下一個困難會在什麼時候出現,這裡分享一個qt5+vs2017的打包釋出方法,希望能對新手有所幫助,廢話不多說,請繼續看下去。 一、dll(動態庫連結) 釋出qt程式,就要找到dll檔案,使

命令行可以執行python腳本jenkins裏執行cannot find Chrome binary

重新 jenkins HR message pytho ann 命令 web AD “selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome bina

eclispe集成Scalas環境後導入外部Spark包object apache is not a member of package org

lisp ava ips package ack 網上 scala環境 sca ember 在Eclipse中集成scala環境後,發現導入的Spark包報錯,提示是:object apache is not a member of package org,網上說了一大推,

mac下安裝bochs使用bximage建立磁碟時 could not write disk image

人生處處不是坑啊。真的是打死不想當運維。。。 這次這個坑是我們用bochs下的bximage建立磁碟的時候: $ bximage ======================================

使用VMWare虛擬機器開啟MFC不支援16位系統

可能這個問題的比較小眾,但還是提供一下自己的思路。 筆者使用的是VMWare Fusion11的版本,採用windows7sp1的虛擬機器。 在開啟Mac系統共享過來的VC++的MFC檔案執行時報錯:不支援16位系統,請聯絡軟體商balabala.... 網上查了很多方法,更改路徑,重啟,設定相容性等。

'ng' 不是內部或外部命令也不是可執行的程式或批處理檔案 或 bash: ng: command not found

重新以管理員許可權執行 npm install -g @angular/cli 如果報錯,就先刪掉 C:\Users\adminstrator\AppData\Roaming\npm\node_modules\@angular\cli\node_modules 目錄,然後再執行&n

【spring cloud】【IDEA】【Maven】spring cloud多模組打包打包的jar包只有幾kjar包無法執行執行no main manifest attribute, in /ms-eureka.jar

======================================================================================== 引申:maven打包多模組spring cloud服務報錯 程式包XXX不存在 : https://www.cnblog

maven 專案mybatisorg.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

maven管理的spring專案在打包install啟動後,mybatis報錯org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): … 錯誤描述: 專案使用mybat

idea執行springboot專案沒打成jar包執行java.lang.IllegalArgumentException: name

idea執行springboot專案沒報錯,打成jar包執行java.lang.IllegalArgumentException: name 解決方法: org.springframework.beans.factory.BeanDefinitionStoreExce

python的sklearn機器學習SVM中的NuSVC執行ValueError: b'specified nu is infeasible'

早上在使用NuSVC進行模型訓練的時候,報錯如下 Reloaded modules: __mp_main__ Traceback (most recent call last): File "<ipython-input-2-c95a09e8e532>", line 1

專案新匯入jar包之後執行類沒有找到異常(java.lang.ClassNotFoundException)

在專案需要讀取一個.xlxs型別的Excel檔案,因為之前一直讀取的是.xls檔案,所以這次在網上新下載了一些jar包,然後更改了程式之後,寫了個demo已經沒問題了。 但是....!!!!!!!!! 當我把程式部署在tomcat下時,執行就出錯了。。。 java.lan