解決 /lib64/libc.so.6: version `GLIBC_2.14' not found 的問題

一、安裝glibc-2.14

[root@jrgc130 ~]# wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
[root@jrgc130 ~]# mv glibc-2.14.tar.gz /opt/software
[root@jrgc130 ~]# cd /opt/software
[root@jrgc130 software]# tar xf glibc-2.14.tar.gz
[root@jrgc130 software]# cd glibc-2.14
[root@jrgc130 glibc-2.14]# mkdir build
[root@jrgc130 glibc-2.14]# cd build
[root@jrgc130 build]# ../configure --prefix=/usr/local/glibc-2.14
[root@jrgc130 build]# make -j4
[root@jrgc130 build]# make install

二、拷貝鏈接庫

[root@jrgc130 build]# cd /usr/local/glibc-2.14/lib
[root@jrgc130 lib]# cp libc-2.16.so /lib64/

三、創建鏈接

[root@jrgc130 lib]# cd /lib64
[root@jrgc130 lib64]# rm -rf libc.so.6

此後會報如下錯誤:

ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

解決方法:

[root@example lib64]# /sbin/sln libc-2.14.so /lib64/libc.so.6

四、查看支持的版本

[root@jrgc130 lib64]# 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_2.13
GLIBC_2.14
GLIBC_PRIVATE

通過ssh連接會報如下錯誤:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory

解決方法:

[root@example ~]# vim /etc/environment 
LANG=en_US.utf-8
LC_ALL=
[root@example ~]# source /etc/environment 
[root@example ~]# localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

五、補充

1.localedef用法

localedef [-c] [-Ccompiler_options] [-fcharmap] 
     [-isourcefile] [-Llinker_options] [-mmodel] 
     [-ucode_set_name] [-W cc,arg] [-xextensions_file]localename
localedef 實用程序會將語言環境類別的源定義轉換至函數和實用程序可用的格式,這些函數和實用程序的操作行爲由語言環境變量的設置來確定;
LC_CTYPE
定義字符分類和大小寫轉換。
LC_COLLATE
定義整理規則。
LC_MONETARY
定義在貨幣信息格式設置中使用的格式和符號。
LC_NUMERIC
爲非貨幣數值編輯定義十進制分隔符、分組以及分組符號。
LC_TIME
定義日期和時間信息的格式和內容。
LC_MESSAGES
定義肯定性和否定性響應的格式和值。
–c
創建永久性輸出,即使已經發出警告消息。
–i sourcefile
包含源定義的文件的路徑名。如果未出現此選項,則會從標準輸入中讀取源定義。

2./sbin/sln
Linux 系統有兩類可執行程序。 
    (1).靜態鏈接的可執行程序包含它們所需的所有庫函數。所有庫函數都鏈接到可執行程序中。它們是完整的程序,不依賴於外部的庫。靜態鏈接程序的優點是它們不要求事先安裝任何東西就可以運行。 
    (2).動態鏈接的可執行程序要小得多,是不完整的,需要來自外部共享 庫的函數才能運行。除了更小之外,動態鏈接還允許包指定依賴的庫,而不需要將庫包含在包中。使用動態鏈接還允許許多運行的程序共享庫的一個副本,這就避免了相同代碼的許多副本佔據內存。由於這些原因,當今的大多數程序採用動態鏈接。 
    在典型的 Linux 系統上,一個有意思的例子是 ln(/bin/ln)命令,它在文件之間創建鏈接,包括硬鏈接和軟(或符號)鏈接。共享庫常常涉及庫的通用名和庫的特定級別之間的符號鏈接,所以如果鏈接不起作用了,那麼可能是 ln 命令出故障了。爲了防止這種情況,Linux 系統包含 ln 程序的一個靜態鏈接版本,即 sln 程序(/sbin/sln)。
[root@jrgc130 ~]# ll -lh /sbin/sln;ll -lh /bin/ln
-rwxr-xr-x. 1 root root 671K Nov 21  2013 /sbin/sln
-rwxr-xr-x. 1 root root 49K Nov 22  2013 /bin/ln
知道了靜態鏈接的程序可能比較大之後,又如何判斷程序是否是靜態鏈接的呢?而且,如果程序是動態鏈接的,又如何知道它需要哪些庫呢?這兩個問題的答案都是使用 ldd 命令,這個命令顯示可執行程序的庫需求信息。
[root@jrgc130 ~]# ldd /sbin/sln /bin/ln
/sbin/sln:
        not a dynamic executable
/bin/ln:
        linux-vdso.so.1 =>  (0x00007fffd7bb9000) #<--將內核態的調用映射到用戶態的地址空間中, 使得調用開銷更小, 路徑更好.
        libc.so.6 => /lib64/libc.so.6 (0x00007f3deb9c1000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003c50000000)
因爲 ldd 實際上關注動態鏈接,所以通過顯示 “not a dynamic executable” 來表示 sln 是靜態鏈接的;對於 ln 命令,它指出兩個共享庫的名稱(libc.so.6 和 ld-linux.so.2)以及這些庫的位置。注意:.so 表示這些是共享對象 或動態庫。
使用 ll 命令顯示這些實際上是庫的特定版本的符號鏈接。 
[root@jrgc130 lib64]# ll /lib64/libc.so.6;                       
lrwxrwxrwx 1 root root 12 Aug  7 09:28 /lib64/libc.so.6 -> libc-2.14.so
那麼,動態裝載程序如何知道去哪裏尋找可執行程序呢?與 Linux 上的許多東西一樣,在/etc中有配置文件。
/etc/ld.so.conf 指定應該包含來自子目錄 ld.so.conf.d 的所有
[root@jrgc130 lib64]# cat /etc/ld.so.conf    
include ld.so.conf.d/*.conf
程序的裝載需要快速,所以 ld.so.conf 被傳遞給 ldconfig 命令,以便處理來自 ld.so.conf.d 的所有庫以及來自受信任目錄(/lib 和 /usr/lib)的庫。
動態裝載程序使用 ld.conf.cache 文件定位要動態裝載和鏈接的文件。如果修改了 ld.so.conf(或者在 ld.so.conf.d 中添加了新的包含文件),那麼必須運行 ldconfig 命令(作爲根用戶)來重新構建 ld.conf.cache 文件。
一般情況下,使用 ldconfig 命令(不帶參數)來重新構建 ld.so.cache。可以指定幾個參數來覆蓋默認行爲。使用 -p 參數顯示 ld.so.cache 的內容。
[root@jrgc130 lib64]# /sbin/ldconfig -p|more
784 libs found in cache `/etc/ld.so.cache'
        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libz.so (libc6,x86-64) => /usr/lib64/libz.so
        libyajl.so.1 (libc6,x86-64) => /usr/lib64/libyajl.so.1
        libxul.so (libc6,x86-64) => /usr/lib64/xulrunner/libxul.so
        libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4
        libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1
        ........
        libBrokenLocale.so.1 (libc6,x86-64, OS ABI: Linux 2.6.18) => /lib64/libBrokenLocale.so.1
        libBrokenLocale.so (libc6,x86-64, OS ABI: Linux 2.6.18) => /usr/lib64/libBrokenLocale.so
        ld-linux-x86-64.so.2 (libc6,x86-64) => /lib64/ld-linux-x86-64.so.2

六、參考

https://docs.oracle.com/cd/E62103_01/html/E62875/localedef-1.html

http://linux.chinaunix.net/techdoc/system/2009/02/08/1061470.shtml

http://adam8157.info/blog/2011/10/linux-vdso/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章