解决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 
相关推荐
ttod_qzstudio7 分钟前
DriveLerpControllerEditor开发总结:一个3D编辑器插值控制系统的实现
vue.js·typescript·编辑器·tdesign
小叶子来了啊16 分钟前
3Arduino IDE 安装
ide
zew10409945883 小时前
PyCharm【2023.2.5】下使用编辑器自带的连接功能,连接MySQL数据库
数据库·mysql·pycharm·编辑器·连接mysql
kong79069284 小时前
Java-Intellij IDEA 自动导包设置
java·ide·intellij-idea
づ安眠丶乐灬9 小时前
计算机视觉中的多视图几何 - 1
人工智能·vscode·计算机视觉
咩咩大主教11 小时前
VSCode远程连接Linux部署的Docker
linux·vscode·docker
UVM_ERROR12 小时前
RDMA Scheduler + TX + Completion RTL 开发经验分享
笔记·vscode·ssh·github·芯片
AA陈超14 小时前
JetBrains Rider ‘IntelliJ‘ 快捷键映射表
ide·intellij-idea·idea·intellij idea
天勤量化大唯粉15 小时前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
charlie11451419116 小时前
深入解构:MSVC 调试机制与 Visual Studio 调试器原理
c++·ide·windows·学习·visual studio·调试·现代c++