解决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

bash 复制代码
# 创建目录存源码
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

bash 复制代码
# 解压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可执行文件

bash 复制代码
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需要的环境变量

bash 复制代码
cd ~
mv .vscode-server .vscode-server-old

在~/.bashrc下加一下

bash 复制代码
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

bash 复制代码
[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 ./node
        linux-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通过环境变量替我们做了

bash 复制代码
$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 
相关推荐
Naiva3 小时前
【小技巧】PyCharm建立项目,VScode+CodeX+WindowsPowerShell开发Python pyQT6
vscode·python·pycharm
EEG小佬3 小时前
Jupyter选择内核时如何找到虚拟环境
ide·python·jupyter
励志成为糕手4 小时前
VSCode+Cline部署本地爬虫fetch-mcp实战
ide·vscode·爬虫·ai·mcp
2503_928411566 小时前
11.5 包和包管理器
数据库·arcgis·node.js·编辑器
名剑走天下7 小时前
在VSCode中:解决终端输出中文乱码问题
ide·vscode·编辑器
兰文彬7 小时前
vscode 安装Jupiter以后,终端无法切换conda环境了
ide·vscode·编辑器
CV小白进阶路7 小时前
【无标题】Vscode 报错 got bad result from install script无法远程链接服务器
服务器·ide·vscode
名剑走天下7 小时前
在 VSCode 中:引入开源cJSon解析库+示例demo
ide·vscode·编辑器
ii_best8 小时前
安卓/IOS工具开发基础教程:按键精灵一个简单的文字识别游戏验证
android·开发语言·游戏·ios·编辑器