解决 Linux “GLIBCXX_* not found” 问题

前言

现在有个需求是搭建一套 golang 的自动化编译部署方案,最好是少量配置一键完成,刚开始我是先自己用代码实现了一套,大体思路是把代码 cp 进含 golang 环境的镜像中打包,再用脚本实现创建容器并执行编译并将编译好的文件导出来,和 pm2.json 一起上传到目标服务器上,再用 golang.org/x/crypto/ssh 连接服务器执行更替部署等任务。

这里用容器编译是因为 cgo 代码不支持交叉编译,在本地 Mac 的环境下动态链接库会出问题。

正常情况下,这套方案已经可以工作了,但是我尝试了一下含 cgo 的代码时文件在服务器上执行时抛出 “./executable_app: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found (required by ./executable_app)” 错误,服务器 libc 版本跟不上…

接下来就是解决这个问题的过程了

Ubuntu

刚开始服务器都是 Ubuntu 14.04,我上传文件执行会抛出这个问题

先是看一下报错的文件

$ ls -l /usr/lib/x86_64-linux-gnu | grep libstdc++.so.6

lrwxrwxrwx 1 root root       19 Feb 14 11:49 libstdc++.so.6 -> libstdc++.so.6.0.19

-rw-r--r-- 1 root root   979056 Feb 14 12:25 libstdc++.so.6.0.19

再看一下 GLIBCXX 版本

$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现服务器上最大版本是 GLIBCXX_3.4.19,而执行文件需要 GLIBCXX_3.4.21

解决办法就是更新 libstdc++.so.6 链接的文件

$ sudo find / -name libstdc++.so.6*

/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19
/data/docker/aufs/diff/0039106da7d10e4e6d803cc04044dc12686f0ea0e2fb70efaaaf53b103c7f815/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21-gdb.py
/data/docker/aufs/diff/0039106da7d10e4e6d803cc04044dc12686f0ea0e2fb70efaaaf53b103c7f815/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
/data/docker/aufs/diff/0039106da7d10e4e6d803cc04044dc12686f0ea0e2fb70efaaaf53b103c7f815/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/11d70867975233caf7b9c507b9ceabf6a233d6dd0070b2ae61ec2047db81955e/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20-gdb.py
/data/docker/aufs/diff/11d70867975233caf7b9c507b9ceabf6a233d6dd0070b2ae61ec2047db81955e/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
/data/docker/aufs/diff/11d70867975233caf7b9c507b9ceabf6a233d6dd0070b2ae61ec2047db81955e/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/9b7dfc62d11331833041039704da391bee2e875e0e2f36a0193ff7bf824a7d4e/usr/lib64/libstdc++.so.6.0.19
/data/docker/aufs/diff/9b7dfc62d11331833041039704da391bee2e875e0e2f36a0193ff7bf824a7d4e/usr/lib64/libstdc++.so.6
/data/docker/aufs/diff/9b7dfc62d11331833041039704da391bee2e875e0e2f36a0193ff7bf824a7d4e/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/data/docker/aufs/diff/9b7dfc62d11331833041039704da391bee2e875e0e2f36a0193ff7bf824a7d4e/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/data/docker/aufs/diff/9b7dfc62d11331833041039704da391bee2e875e0e2f36a0193ff7bf824a7d4e/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/data/docker/aufs/diff/0197a1011d6776a0acbf37dde7abe7fb16c57600920c5bd901ecb87f4c2cd566/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py
/data/docker/aufs/diff/0197a1011d6776a0acbf37dde7abe7fb16c57600920c5bd901ecb87f4c2cd566/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19
/data/docker/aufs/diff/0197a1011d6776a0acbf37dde7abe7fb16c57600920c5bd901ecb87f4c2cd566/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/e85d386ce1c51a2947230b1a68022eeb185ae007d5a81116463f69c1d7cce83a/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21-gdb.py
/data/docker/aufs/diff/e85d386ce1c51a2947230b1a68022eeb185ae007d5a81116463f69c1d7cce83a/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
/data/docker/aufs/diff/e85d386ce1c51a2947230b1a68022eeb185ae007d5a81116463f69c1d7cce83a/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/fd016d77ce56dc026a2d4e900738d77aba22576d88a2d0862fd2a71ef2c851db/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/data/docker/aufs/diff/fd016d77ce56dc026a2d4e900738d77aba22576d88a2d0862fd2a71ef2c851db/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/fd016d77ce56dc026a2d4e900738d77aba22576d88a2d0862fd2a71ef2c851db/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/data/docker/aufs/diff/139097aa22fa2eafb30728f121d77b5105c4d37351f7c3bc8fec833f235bf57d/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/data/docker/aufs/diff/139097aa22fa2eafb30728f121d77b5105c4d37351f7c3bc8fec833f235bf57d/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/data/docker/aufs/diff/139097aa22fa2eafb30728f121d77b5105c4d37351f7c3bc8fec833f235bf57d/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/data/docker/aufs/mnt/56e9f10df36b6d08d75f2373ba8ff1bbba747cf0bdd368c49a3ffde835816fb9/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py
/data/docker/aufs/mnt/56e9f10df36b6d08d75f2373ba8ff1bbba747cf0bdd368c49a3ffde835816fb9/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19
/data/docker/aufs/mnt/56e9f10df36b6d08d75f2373ba8ff1bbba747cf0bdd368c49a3ffde835816fb9/usr/lib/x86_64-linux-gnu/libstdc++.so.6

先在服务器上找一下有没有更高版本的,发现有并且含 GLIBCXX_3.4.21

$ sudo strings /data/docker/aufs/diff/0039106da7d10e4e6d803cc04044dc12686f0ea0e2fb70efaaaf53b103c7f815/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_DEBUG_MESSAGE_LENGTH

然后就是替换 libstdc++.so.6 链接对象

$ sudo cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6-origin

$ sudo cp /data/docker/aufs/diff/0039106da7d10e4e6d803cc04044dc12686f0ea0e2fb70efaaaf53b103c7f815/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

$ ls -l /usr/lib/x86_64-linux-gnu | grep libstdc++.so.6

lrwxrwxrwx 1 root root       19 Aug 10 10:56 libstdc++.so.6 -> libstdc++.so.6.0.21
-rw-r--r-- 1 root root   979056 Feb 14 12:25 libstdc++.so.6.0.19
-rw-r--r-- 1 root root  1566440 Aug 10 10:55 libstdc++.so.6.0.21
lrwxrwxrwx 1 root root       19 Feb 14 11:49 libstdc++.so.6-origin -> libstdc++.so.6.0.19

再查看 libstdc++.so.6 就能正常工作了

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_DEBUG_MESSAGE_LENGTH

ubuntu 至此就没问题了,不过 centos 可能会出现另一个问题

CentOS

后面我又试了下在我自己的服务器上运行那个编译文件,系统是 CentOS 7.4 的,也有相同的问题,不过解决过程更麻烦一点,还差点掉坑里

$ ./sandiego_linux_amd64

./sandiego_linux_amd64: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./sandiego_linux_amd64)

我也是按照上面的流程修复了 libstdc++.so.6

$ strings /lib64/libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
$ find / -name libstdc++.so.6\*

/usr/lib64/libstdc++.so.6.0.19
/usr/lib64/libstdc++.so.6
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/var/lib/docker/overlay2/a684a171c4a4128e7417e8a6e99711a6c1e8695b28c79f7ac04853b4c791a8f8/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/var/lib/docker/overlay2/a684a171c4a4128e7417e8a6e99711a6c1e8695b28c79f7ac04853b4c791a8f8/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/a684a171c4a4128e7417e8a6e99711a6c1e8695b28c79f7ac04853b4c791a8f8/diff/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/var/lib/docker/overlay2/fa428337aa603033a75ff741800ffef75acff1ba104fe044f9ca7638a619603f/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
/var/lib/docker/overlay2/fa428337aa603033a75ff741800ffef75acff1ba104fe044f9ca7638a619603f/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/fa428337aa603033a75ff741800ffef75acff1ba104fe044f9ca7638a619603f/diff/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20-gdb.py
/var/lib/docker/overlay2/f264ff978011ceb0913e9b52945cc0d4c078420e21142c109f64bcf6b201834b/diff/usr/lib/libstdc++.so.6.0.22
/var/lib/docker/overlay2/f264ff978011ceb0913e9b52945cc0d4c078420e21142c109f64bcf6b201834b/diff/usr/lib/libstdc++.so.6
/var/lib/docker/overlay2/89238692efa754a079f6e717e168cb48f2f8adac8e63292d262e01785e91d460/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
/var/lib/docker/overlay2/89238692efa754a079f6e717e168cb48f2f8adac8e63292d262e01785e91d460/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/89238692efa754a079f6e717e168cb48f2f8adac8e63292d262e01785e91d460/merged/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20-gdb.py
/var/lib/docker/overlay2/eb1f84e1a57c8265bb7fbafa30bc0981288b0c0aa847798f1b0a39c38febd2ef/merged/usr/lib/libstdc++.so.6.0.22
/var/lib/docker/overlay2/eb1f84e1a57c8265bb7fbafa30bc0981288b0c0aa847798f1b0a39c38febd2ef/merged/usr/lib/libstdc++.so.6
/var/lib/docker/overlay2/7fbe72e3e9edf981e086ad156989a803f163f8571d39dad8b637a10426b58851/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/var/lib/docker/overlay2/7fbe72e3e9edf981e086ad156989a803f163f8571d39dad8b637a10426b58851/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/7fbe72e3e9edf981e086ad156989a803f163f8571d39dad8b637a10426b58851/merged/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/var/lib/docker/overlay2/8a41168be743b65c43f8b0342b801fce9ba1bd54ed01e352495760c83f8b7849/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/var/lib/docker/overlay2/8a41168be743b65c43f8b0342b801fce9ba1bd54ed01e352495760c83f8b7849/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/8a41168be743b65c43f8b0342b801fce9ba1bd54ed01e352495760c83f8b7849/diff/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/var/lib/docker/overlay2/b64f28f6eb7ec7e168852defcca0a96bff8f83eb7cb09aad03a8b61354c79109/diff/usr/lib/libstdc++.so.6.0.22
/var/lib/docker/overlay2/b64f28f6eb7ec7e168852defcca0a96bff8f83eb7cb09aad03a8b61354c79109/diff/usr/lib/libstdc++.so.6
/var/lib/docker/overlay2/a7d90ff54666e6643a5a8022eab09de4f6673f6310a22b33d3cd4a426e9a5522/diff/usr/lib/libstdc++.so.6.0.22
/var/lib/docker/overlay2/a7d90ff54666e6643a5a8022eab09de4f6673f6310a22b33d3cd4a426e9a5522/diff/usr/lib/libstdc++.so.6
/var/lib/docker/overlay2/7b3bd089203729781d7babc38748ea6e91a48bdf09858273ce64db53b32c0b20/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
/var/lib/docker/overlay2/7b3bd089203729781d7babc38748ea6e91a48bdf09858273ce64db53b32c0b20/merged/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/7b3bd089203729781d7babc38748ea6e91a48bdf09858273ce64db53b32c0b20/merged/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22-gdb.py
/var/lib/docker/overlay2/c3b0fa0a437340abf590624f28339b85868d1918587356f119c2375f9ebc0006/merged/usr/lib/libstdc++.so.6.0.22
/var/lib/docker/overlay2/c3b0fa0a437340abf590624f28339b85868d1918587356f119c2375f9ebc0006/merged/usr/lib/libstdc++.so.6
$ strings /var/lib/docker/overlay2/a684a171c4a4128e7417e8a6e99711a6c1e8695b28c79f7ac04853b4c791a8f8/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_DEBUG_MESSAGE_LENGTH

找到并替换了文件,但是执行文件后又抛出另一个错误 “GLIBC_2.18’ not found”

$ ./sandiego_linux_amd64

./sandiego_linux_amd64: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)

刚开始我以为这个文件和 libstdc++.so.6 一样找到新版本重链接就行,结果差点掉坑里

先是看了看文件信息

$ ll /lib64/ | grep libc.so.6

lrwxrwxrwx   1 root root   12 Aug 13 14:34 libc.so.6 -> libc-2.17.so

$ strings /usr/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_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
GLIBC_PRIVATE
GLIBC_2.8
GLIBC_2.3
GLIBC_2.5
GLIBC_2.4
GLIBC_2.9
GLIBC_2.7
GLIBC_2.6
GLIBC_2.3.2
GLIBC_2.3.4
GLIBC_2.3.3
GLIBC_2.15
GLIBC_2.14
GLIBC_2.11
GLIBC_2.16
GLIBC_2.10
GLIBC_2.17
GLIBC_2.12
GLIBC_2.13
GLIBC_2.2.5
GLIBC_2.2.6

$ ldd --version

ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

然后找

$ find / -name libc-2.\*

/usr/lib64/libc-2.17.so
/var/lib/docker/overlay2/a684a171c4a4128e7417e8a6e99711a6c1e8695b28c79f7ac04853b4c791a8f8/diff/lib/x86_64-linux-gnu/libc-2.24.so
/var/lib/docker/overlay2/fa428337aa603033a75ff741800ffef75acff1ba104fe044f9ca7638a619603f/diff/lib/x86_64-linux-gnu/libc-2.19.so
/var/lib/docker/overlay2/89238692efa754a079f6e717e168cb48f2f8adac8e63292d262e01785e91d460/merged/lib/x86_64-linux-gnu/libc-2.19.so
/var/lib/docker/overlay2/7fbe72e3e9edf981e086ad156989a803f163f8571d39dad8b637a10426b58851/merged/lib/x86_64-linux-gnu/libc-2.24.so
/var/lib/docker/overlay2/8a41168be743b65c43f8b0342b801fce9ba1bd54ed01e352495760c83f8b7849/diff/lib/x86_64-linux-gnu/libc-2.24.so
/var/lib/docker/overlay2/7b3bd089203729781d7babc38748ea6e91a48bdf09858273ce64db53b32c0b20/merged/lib/x86_64-linux-gnu/libc-2.24.so

我把其中一个 libc-2.24.so 替换了原来的,结果出大麻烦了,把原来的 libc.so.6 移动或者重命名后,什么指令都报错

$ ls -l | grep libc.so

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

这个 libc.so.6 文件是系统底层链接库,移动后,其他依托于这个文件的命令都没法正常运行了,甚至我想把文件重新弄回去也没办法了,因为 mv、cp 都失效了,那时候我已经觉得凉凉~,可能要重装系统了,gg

先是上网查了一下看看有没有解决办法,找了一圈在 Stack Overflow 上找了几个答案,有一个特别好用:

$ ldconfig -l -v /lib64/libc-2.17.so

    libc.so.6 -> libc-2.17.so (changed)

这个 ldconfig 可以直接改回去,命令就恢复正常了,呼~

所以 CentOS 不能按照 libstdc++.so.6 那一套解决版本问题,升级 libc.so.6 需要另外的方法:

$ wget https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.20.tar.gz

$ tar -zxvf glibc-2.20.tar.gz

$ mkdir glibcbuild

$ cd glibcbuild

$ ../glibc-2.20/configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

$ make

$ make install

$ ldd --version

ldd (GNU libc) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

安装过程比较缓慢,耐心等待会好,libc 升级完,原来的编译文件就可以运行了

最后 golang 的自动编译部署方案弃用了这一套,因为每个服务器都得这么折腾一遍太麻烦,我后来用 Jenkins 搭建了一套自动化编译部署的流程,过程更快效果更好

文章目录
  1. 前言
  2. Ubuntu
  3. CentOS