解决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 
相关推荐
golang学习记3 小时前
Zed 新特性:AI 还在跑,电脑可以不睡了
人工智能·vscode·电脑·zed
zpjing~.~14 小时前
Vim 高效批量替换实战:从 /dev/ 替换为 /dev-ai/
人工智能·编辑器·vim
瑶山14 小时前
Windows + WSL2 Ubuntu + VS Code配置C++开发环境
开发语言·c++·windows·vscode·wsl
苏辰澈15 小时前
C++独属于自己的变身:多态
c语言·开发语言·c++·visualstudio·编辑器
golang学习记1 天前
VSCode多光标迎来重大更新
ide·vscode·编辑器
sm_926787051 天前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
专业程序开发源1 天前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
夜雪一千1 天前
如何取消PyCharm自动识别test开头文件并进入测试模式
ide·python·pycharm
小李不困还能学1 天前
PyCharm远程开发连接失败排查与解决
ide·python·pycharm
测试开发Kevin1 天前
IDEA工程结构解析:项目、模块、库、Facet、Artifact (工件) 概念说明
java·ide·intellij idea