解决 /lib64/libc.so.6: version `GLIBC_2.14' not found 的问题

时间:2021-04-16 16:43:18

一、安装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 GLIBCGLIBC_2.2.5GLIBC_2.2.6GLIBC_2.3GLIBC_2.3.2GLIBC_2.3.3GLIBC_2.3.4GLIBC_2.4GLIBC_2.5GLIBC_2.6GLIBC_2.7GLIBC_2.8GLIBC_2.9GLIBC_2.10GLIBC_2.11GLIBC_2.12GLIBC_2.13GLIBC_2.14GLIBC_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-8LC_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]localenamelocaledef 实用程序会将语言环境类别的源定义转换至函数和实用程序可用的格式,这些函数和实用程序的操作行为由语言环境变量的设置来确定;LC_CTYPE定义字符分类和大小写转换。LC_COLLATE定义整理规则。LC_MONETARY定义在货币信息格式设置中使用的格式和符号。LC_NUMERIC为非货币数值编辑定义十进制分隔符、分组以及分组符号。LC_TIME定义日期和时间信息的格式和内容。LC_MESSAGES定义肯定性和否定性响应的格式和值。�Cc创建永久性输出,即使已经发出警告消息。�Ci sourcefile包含源定义的文件的路径名。如果未出现此选项,则会从标准输入中读取源定义。2./sbin/slnLinux 系统有两类可执行程序。     (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|more784 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/