非root升級glibc——VSCode遠程開發環境搭建踩坑

緒論

在Linux下開發應用時,VS Code配合Remote SSH擴展是我感覺相對舒適的配置,但在較為老舊的服務器環境上,這樣的搭配可能因為vscode-server的運行環境——Node.js找不到合適的glibc版本而無法運行,因此需要更新glibc等動態庫的版本。本文將介紹一種基於patchelf的glibc升級方法,該方法不需要root權限,隻要有辦法將所需文件傳輸到服務器上即可實現。

環境介紹

本文中服務器的操作系統版本為Ubuntu 12.04.2,已安裝gcc 4.6.3,已安裝binutils(版本忘瞭,不重要)。glibc最高版本2.15,glibcxx最高版本GLIBCXX_3.4.16。

環境基本情況

使用的node版本為v16.16.0,為本文編輯時最新的LTS版本。

問題概述

錯誤信息

直接運行./node時,動態庫裝載器ld-linux-x86_64.so.2會提示找不到glibc的2.16和2.17版本,緊接著還會提示找不到glibcxx的3.4.18版本,結合上一章節的環境信息,可以斷定系統自帶的glibc以及無法滿足node的運行要求,需要升級版本。

解決思路

在node運行前,動態庫裝載器會在系統中尋找所需的動態庫,可以使用readelf -d node查看,如下圖

所需的動態庫列表

要解決上述問題,需要讓裝載器加載更新版本的動態庫。裝載器的搜索順序有優先級,依次為:LD_PRELOAD(環境變量)、RUNPATH(寫在ELF文件內)、LD_LIBRARY_PATH(環境變量)、/etc/ld.so.conf(配置文件)、/lib、/usr/lib。很顯然,隻能從前三項入手,因為後面幾項都需要root權限。前三項的兩個環境變量有很大的副作用,會導致其他依賴glibc的程序無法運行,甚至影響到ls這樣基本的命令,因此最好是對第二項下手。

現在本文的主角——patchelf終於要出場瞭,顧名思義,這是一個修改elf文件的工具,有瞭它,才能對ELF的RUNPATH做修改。

解決方法

根據“問題描述”章節的信息,node需要glibc>=2.17和glibcxx>=3.4.18。在哪裡可以下載到這兩個動態庫呢,Ubuntu官方提供的軟件包倉庫就有。為瞭下載速度,可以使用清華的鏡像站提供的倉庫。glibc的軟件包名前綴為libc6,路徑為poll/main/g/glibc,版本不低於2.17即可,清華鏡像站存放的最低版本都是2.23,比目標版本高很多,但是測試後確實能正常運行。

而glibcxx與gcc捆綁,包名前綴libstdc++6,路徑為pool/main/g/gcc<版本>,需要確定該下載哪個版本,GNU GCC官網提供瞭一份gcc與glibc、glibcxx的版本關系對照表。根據這份表,能夠確定glibcxx3.4.18對應的gcc最低版本為4.8.0,本文選擇瞭4.8.4。

將兩份deb文件以及patchelf的發佈版本傳到服務上,如下圖

是用戶文件夾下的lib,沒有就新建

接著解壓三個壓縮包,dpkg會報錯所以用ar解壓

tar -xzf patchelf-0.15.0-x86_64.tar.gz
ar -xv libc6_2.23-0ubuntu11.3_amd64.deb
tar -xaf data.tar.xz
ar -xv libstdc++6_4.8.4-2ubuntu1~14.04.4_amd64.deb
tar -xaf data.tar.xz

赞(0)