解决glibc版本低VSCode无法远程问题
因glibc版本低vscode无法远程
根本原因:本质上不是 vscode的问题,是vscode升级了其依赖的nodejs版本,nodejs高版本的要求最低版本的 glibc和libstdc++比较高。
从vscode 1.86 版本更新要求 GLIBCXX >= 3.4.25 GLIBC >= 2.28
一般这两种解决方案比较容易:
用老版本vscode 18.5
用老版本的vscode 尽量用vscode-portable不会影响你已有的vscode版本环境,下载一个老版本vscode的vscode-portable来用 https://portapps.io/app/vscode-portable/ 例如下载一个 version: 1.85.1-48 Pltaform:Windows 64-bits Format:Portable setup 来用。
旁路升级一套新的 高版本glibc和gcc
注意一定不要用root用户来操作,建议新增一个linux用户来搞,先进行试验。
旁路升级一套新的 高版本的 glibc 和 gcc,本质上不是 vscode的问题,是vscode升级了其依赖的nodejs版本,nodejs高版本的要求最低版本的 glibc和libstdc++比较高。解决方法就是让vscode的nodejs可执行文件的 动态库 去使用我们指定的 glic和 gcc lib。
glibc2.42
先现在一套glibc代码 http://ftp.gnu.org/gnu/libc/glibc-2.42.tar.gz
# 创建目录存源码
mkdir -p ~/build/glibc
cd ~/build/glibc
# 下载源码
wget http://ftp.gnu.org/gnu/libc/glibc-2.42.tar.gz
tar xf glibc-2.42.tar.gz
cd glibc-2.42
mkdir -p ~/local/glibc-2.42
mkdir build
cd build
# 请注意在此我们切换到我们尽量高的gcc版本 不然编译不过glibc也挺难搞
# gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) 实际测试可以编译得过
../configure --prefix=$HOME/local/glibc-2.42
make -j$(nproc)
make install
不出意外此时 家目录下local/glibc-2.42有了glibc-2.42
gcc12.2.0
便一套高版本的 gcc,gcc-12.2.0,在 $HOME/local/gcc-12.2.0下
https://ftp.jaist.ac.jp/pub/GNU/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2
https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2
https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.2.1.tar.gz
# 解压gcc-12.2.0.tar.gz 得到 gcc-12.2.0 文件夹
tar -xjf gmp-6.2.1.tar.bz2
# 得到gmp-6.2.1文件夹
tar -xjf mpfr-4.1.0.tar.bz2
# 得到mpfr-4.1.0文件夹
tar -xzf mpc-1.2.1.tar.gz
# 得到mpc-1.2.1文件夹
cd gcc-12.2.0
ln -sf ../gmp-6.2.1 gmp
ln -sf ../mpfr-4.1.0 mpfr
ln -sf ../mpc-1.2.1 mpc
# 将我们的gmp mpfr mpc源码目录软连接到gcc-12.2.0下面 的 gmp mpfr mpc
cd ..
mkdir gcc-12.2.0-build
cd gcc-12.2.0-build
# 切换到gcc版本高的devtool
# gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) 实际测试可以编译得过
../gcc-12.2.0/configure --prefix=$HOME/local/gcc-12.2.0 --enable-languages=c,c++ --disable-multilib
make -j10
make install
不出意外你将会在 $HOME/local/gcc-12.2.0下得到一份 gcc12.2.0
patchelf
下载patchelf源码编译出patchelf可执行文件
mkdir -p ~/build/patchelf
cd ~/build/patchelf
# 下载https://github.com/NixOS/patchelf/releases/download/0.17.3/patchelf-0.17.3.tar.bz2
tar xf patchelf-0.17.3.tar.bz2
cd patchelf-0.17.3
# 切换到gcc版本搞的devtool
# gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) 实际测试可以编译得过
./configure --prefix=$HOME/local/patchelf
make -j$(nproc)
make install
修改vscode需要的环境变量
cd ~
mv .vscode-server .vscode-server-old
在~/.bashrc下加一下
export VSCODE_SERVER_CUSTOM_GLIBC_LINKER=$HOME/local/glibc-2.28/lib/ld-2.28.so
export VSCODE_SERVER_CUSTOM_GLIBC_PATH=$HOME/local/glibc-2.28/lib:/data/home/gaowanlu/local/gcc-12.2.0/lib64
export VSCODE_SERVER_PATCHELF_PATH=$HOME/local/patchelf/bin/patchelf
请注意先检查下 上面的这三个路径是否生产存在
然后使用最新版本的vscode重新远程连接到我们刚才配置的主机的用户。
不出意外既可以正常使用了,正常远程连接可以使用后,可以看一下vscode-server的nodejs可执行文件用的glibc和gcc lib
[gaowanlu@vhost02 server]$ pwd
/data/home/gaowanlu/.vscode-server/cli/servers/Stable-7d842fb85a0275a4a8e4d7e040d2625abbf7f084/server
[gaowanlu@vhost02 server]$ ls
bin  extensions  LICENSE  node  node_modules  out  package.json  product.json
[gaowanlu@vhost02 server]$ ldd ./nodelinux-vdso.so.1 =>  (0x00007ffc2e9b6000)libdl.so.2 => /data/home/gaowanlu/local/glibc-2.28/lib/libdl.so.2 (0x00007f6120cbf000)libstdc++.so.6 => /data/home/gaowanlu/local/gcc-12.2.0/lib64/libstdc++.so.6 (0x00007f61208a9000)libm.so.6 => /data/home/gaowanlu/local/glibc-2.28/lib/libm.so.6 (0x00007f612052b000)libgcc_s.so.1 => /data/home/gaowanlu/local/gcc-12.2.0/lib64/libgcc_s.so.1 (0x00007f612030d000)libpthread.so.0 => /data/home/gaowanlu/local/glibc-2.28/lib/libpthread.so.0 (0x00007f61200ee000)libc.so.6 => /data/home/gaowanlu/local/glibc-2.28/lib/libc.so.6 (0x00007f611fd36000)/data/home/gaowanlu/local/glibc-2.28/lib/ld-2.28.so => /lib64/ld-linux-x86-64.so.2 (0x00007f6120ec3000)
也可以看出用的是我们旁路 编译出的高版本 lib
其实vscode通过环境变量替我们做了
$HOME/local/patchelf/bin/patchelf \
>  --set-interpreter $HOME/local/glibc-2.28/lib/ld-2.28.so \
> --set-rpath $HOME/local/glibc-2.28/lib:$HOME/local/gcc-12.2.0/lib64 \
> --force-rpath ./node 
