在老舊的系統(tǒng)環(huán)境下使用Rust開發(fā)工具
筆者的一臺硬件資源緊張的舊電腦安裝了Ubuntu-12.04,希望在其上運(yùn)行比較新的Rust開發(fā)工具,但卻發(fā)現(xiàn)其因glibc較老,不能正常運(yùn)行cargo工具,結(jié)果如下:
yejq@UNIX:~$ uname -a
Linux UNIX 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
yejq@UNIX:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
yejq@UNIX:~$ cargo new --bin hello
cargo: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by cargo)
如上,cargo
可執(zhí)行文件對glibc
最低版本要求是GLIBC_2.17
,而Ubuntu-12.04系統(tǒng)的glibc
版本較低,因此不能正常運(yùn)行。一種可行的解決方法是使用docker容量在Ubuntu-12.04系統(tǒng)下使用新的Rust開發(fā)工具;但限于筆者對docker了解程度比較淺,并沒有嘗試該方法。筆者想到的方法也比較簡單直接(此前的博客對該方法有相關(guān)的說明):在Ubuntu-12.04系統(tǒng)上安裝Ubuntu-22.04系統(tǒng)的glibc
動態(tài)庫(不替換原先的glibc庫),之后修改Rust開發(fā)工具的可執(zhí)行文件,強(qiáng)制其依賴新的glibc
庫。
在Ubuntu-22.04下載并解壓新的glibc動態(tài)庫
首先,筆者需要另一臺安裝了較新版本Ubuntu的系統(tǒng)環(huán)境(Ubuntu-22.04),使用apt-get download
命令下載四個相關(guān)的deb
軟件包:
yejq@ubuntu:~/x64_libs$ apt-get download libc6
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates/main amd64 libc6 amd64 2.35-0ubuntu3.6 [3,236 kB]
Fetched 3,236 kB in 1s (2,870 kB/s)
yejq@ubuntu:~/x64_libs$ apt-get download libgcc-s1
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates/main amd64 libgcc-s1 amd64 12.3.0-1ubuntu1~22.04 [53.9 kB]
Fetched 53.9 kB in 0s (123 kB/s)
yejq@ubuntu:~/x64_libs$ apt-get download libstdc++6
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates/main amd64 libstdc++6 amd64 12.3.0-1ubuntu1~22.04 [699 kB]
Fetched 699 kB in 1s (1,158 kB/s)
yejq@ubuntu:~/x64_libs$ apt-get download zlib1g
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates/main amd64 zlib1g amd64 1:1.2.11.dfsg-2ubuntu9.2 [58.4 kB]
Fetched 58.4 kB in 0s (145 kB/s)
yejq@ubuntu:~/x64_libs$ ls -lh *.deb
-rw-r--r-- 1 yejq yejq 3.1M Jan 10 20:40 libc6_2.35-0ubuntu3.6_amd64.deb
-rw-r--r-- 1 yejq yejq 53K Jun 29 2023 libgcc-s1_12.3.0-1ubuntu1~22.04_amd64.deb
-rw-r--r-- 1 yejq yejq 683K Jun 29 2023 libstdc++6_12.3.0-1ubuntu1~22.04_amd64.deb
-rw-r--r-- 1 yejq yejq 58K Oct 18 2022 zlib1g_1%3a1.2.11.dfsg-2ubuntu9.2_amd64.deb
之后再手動解壓這四個軟件包,其中包含了我們要在Ubuntu-12.04系統(tǒng)中安裝的動態(tài)庫。以libgcc-s1
軟件包為例,下面是解壓的操作:
yejq@ubuntu:~/x64_libs$ ls -lh libgcc-s1_12.3.0-1ubuntu1~22.04_amd64.deb
-rw-r--r-- 1 yejq yejq 53K Jun 29 2023 libgcc-s1_12.3.0-1ubuntu1~22.04_amd64.deb
yejq@ubuntu:~/x64_libs$ ar x libgcc-s1_12.3.0-1ubuntu1~22.04_amd64.deb
yejq@ubuntu:~/x64_libs$ ls -lh control.tar.zst data.tar.zst debian-binary
-rw-r--r-- 1 yejq yejq 1.7K Feb 17 20:15 control.tar.zst
-rw-r--r-- 1 yejq yejq 51K Feb 17 20:15 data.tar.zst
-rw-r--r-- 1 yejq yejq 4 Feb 17 20:15 debian-binary
yejq@ubuntu:~/x64_libs$ tar -axf data.tar.zst
yejq@ubuntu:~/x64_libs$ find ./lib
./lib
./lib/x86_64-linux-gnu
./lib/x86_64-linux-gnu/libgcc_s.so.1
yejq@ubuntu:~/x64_libs$ mkdir -p lib64
yejq@ubuntu:~/x64_libs$ mv ./lib/x86_64-linux-gnu/* ./lib64/
如上,使用ar x
命令解壓deb
包可以獲得三個文件:control.tar.zst/data.tar.zst/debian-binary
;之后再次解壓data.tar.zst
,可得到./lib
文件夾,其中包含了我們想要的動態(tài)庫。對另外三個deb
需要重復(fù)這個解壓的操作。最后將所有的動態(tài)庫全部都集中到./lib64
文件夾下,復(fù)制到Ubuntu-12.04系統(tǒng)中(注意軟鏈接的復(fù)制)。筆者得到的lib64
文件夾中的內(nèi)容有(多了一些ncurses的庫):
yejq@ubuntu:~/x64_libs$ ls ./lib64
audit libmenu.so.6.3 libpthread.so.0
gconv libm.so.6 libresolv.so.2
ld-linux-x86-64.so.2 libmvec.so.1 librt.so.1
libanl.so.1 libncurses.so.6 libstdc++.so.6
libBrokenLocale.so.1 libncurses.so.6.3 libstdc++.so.6.0.30
libc_malloc_debug.so.0 libnsl.so.1 libthread_db.so.1
libc.so.6 libnss_compat.so.2 libtic.so.6
libdl.so.2 libnss_dns.so.2 libtic.so.6.3
libform.so.6 libnss_files.so.2 libtinfo.so.6
libform.so.6.3 libnss_hesiod.so.2 libtinfo.so.6.3
libgcc_s.so.1 libpanel.so.6 libutil.so.1
libmemusage.so libpanel.so.6.3 libz.so.1
libmenu.so.6 libpcprofile.so libz.so.1.2.11
在Ubuntu-12.04系統(tǒng)上修改新的glibc
筆者在Ubuntu-12.04系統(tǒng)下創(chuàng)建了/home/user/x64_libs
文件夾,并將lib64
文件夾復(fù)制到該目錄。之后筆者通過modify.sh
腳本,直接修改了lib64
中的動態(tài)庫:
root@UNIX:/home/user/x64_libs# ls
lib64 modify.sh
root@UNIX:/home/user/x64_libs# ./modify.sh
xxd -g 26 -l 26 -s 11712 lib64/gconv/gconv-modules.cache
INFO: processing [lib64/gconv/gconv-modules.cache], (/usr/lib/x86_64-linux-gnu/) replaced 1 time(s).
xxd -g 26 -l 26 -s 180311 lib64/ld-linux-x86-64.so.2
xxd -g 26 -l 26 -s 182135 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/usr/lib/x86_64-linux-gnu/) replaced 2 time(s).
xxd -g 26 -l 26 -s 1951808 lib64/libc.so.6
xxd -g 26 -l 26 -s 1953808 lib64/libc.so.6
INFO: processing [lib64/libc.so.6], (/usr/lib/x86_64-linux-gnu/) replaced 2 time(s).
xxd -g 16 -l 16 -s 188955 lib64/ld-linux-x86-64.so.2
xxd -g 16 -l 16 -s 204139 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/etc/ld.so.cache) replaced 2 time(s).
xxd -g 22 -l 22 -s 180288 lib64/ld-linux-x86-64.so.2
xxd -g 22 -l 22 -s 182112 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/lib/x86_64-linux-gnu/) replaced 2 time(s).
xxd -g 9 -l 9 -s 180344 lib64/ld-linux-x86-64.so.2
xxd -g 9 -l 9 -s 182168 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/usr/lib/) replaced 2 time(s).
xxd -g 5 -l 5 -s 26613 lib64/ld-linux-x86-64.so.2
xxd -g 5 -l 5 -s 44617 lib64/ld-linux-x86-64.so.2
xxd -g 5 -l 5 -s 180338 lib64/ld-linux-x86-64.so.2
xxd -g 5 -l 5 -s 182162 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/lib/) replaced 4 time(s).
xxd -g 27 -l 27 -s 189539 lib64/ld-linux-x86-64.so.2
xxd -g 27 -l 27 -s 205047 lib64/ld-linux-x86-64.so.2
INFO: processing [lib64/ld-linux-x86-64.so.2], (/lib64/ld-linux-x86-64.so.2) replaced 2 time(s).
xxd -g 27 -l 27 -s 1982000 lib64/libc.so.6
INFO: processing [lib64/libc.so.6], (/lib64/ld-linux-x86-64.so.2) replaced 1 time(s).
`/lib64/ld-linux-x86-64.so.y' -> `/home/user/x64_libs/lib64/ld-linux-x86-64.so.2'
腳本modify.sh
調(diào)用了筆者編寫的一個簡單的hed
工具,用于批量替換二進(jìn)制文件中的字符串或二進(jìn)制數(shù)據(jù)(有需要可以聯(lián)系筆者),該腳本的內(nèi)容如下:
root@UNIX:/home/user/x64_libs# cat modify.sh
#!/bin/bash
REPSTR='/home/user/x64_libs/lib64/'
OLDSTR='/usr/lib/x86_64-linux-gnu/'
if [ $UID -ne 0 ] ; then
echo "Error, run again as root." 1>&2
exit 1
fi
hed 'lib64/gconv/gconv-modules.cache' \
'lib64/ld-linux-x86-64.so.2' \
'lib64/libc.so.6' -s \
"${OLDSTR}" "${REPSTR}"
sync ; sleep 1
# /lib/
# /usr/lib/
# /lib/x86_64-linux-gnu/
hed 'lib64/ld-linux-x86-64.so.2' -s \
'/etc/ld.so.cache' \
'/etc/ld.so.cachy' \
'/lib/x86_64-linux-gnu/' \
'/NON/x86_64-linux-gnu/' \
'/usr/lib/' \
'/usr/NON/' \
'/lib/' \
'/NON/'
sync ; sleep 1
hed 'lib64/ld-linux-x86-64.so.2' \
'lib64/libc.so.6' -s \
'/lib64/ld-linux-x86-64.so.2' \
'/lib64/ld-linux-x86-64.so.y'
ln -sv "$(readlink -f ./lib64/ld-linux-x86-64.so.2)" \
'/lib64/ld-linux-x86-64.so.y'
sync
該操作完成后,接下來就需要修改Rust開發(fā)工具了。
修改安裝于Ubuntu-12.04系統(tǒng)上的Rust工具鏈
筆者將Rust開發(fā)工具鏈安裝到了/opt/rust-lang
路徑下(可參考筆者之前的相關(guān)博客);實際上,這個工具鏈?zhǔn)窃赨buntu-22.04下安裝的,之后筆者將其打包復(fù)制到了Ubuntu-12.04系統(tǒng)中。執(zhí)行以下命令,可以批量替換/opt/rust-lang
路徑下的可執(zhí)行文件使用的動態(tài)鏈接器(從而強(qiáng)制其使用在Ubuntu-22.04系統(tǒng)下載的新的glibc動態(tài)庫):
root@UNIX:/opt/rust-lang# find ./ -type f -print0 | xargs -0 -i hed {} -s /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.y
以上命令執(zhí)行完成后,就可以在Ubuntu-12.04系統(tǒng)中正常使用新版本的Rust開發(fā)工具了:
yejq@UNIX:~$ cargo --version
cargo 1.72.1 (103a7ff2e 2023-08-15)
yejq@UNIX:~$ cargo new --bin hello
Created binary (application) `hello` package
yejq@UNIX:~$ cd hello/
yejq@UNIX:~/hello$ ls
Cargo.toml src
yejq@UNIX:~/hello$ cargo build --release -j1
Compiling hello v0.1.0 (/home/yejq/hello)
Finished release [optimized] target(s) in 1.00s
yejq@UNIX:~/hello$ ./target/release/hello
Hello, world!
這種方法雖然可行,但仍存在一個問題:Ubuntu-12.04系統(tǒng)安裝的gcc版本太老了,它作為Rust在編譯構(gòu)建時的鏈接器,可能會存在鏈接失敗的問題。不過針對這個潛在的問題,我們?nèi)杂薪鉀Q方案:從此處下載新版本的gcc編譯器,通過TARGET_CC
這一與Rust編譯鏈接相關(guān)的環(huán)境變量強(qiáng)制其使用新版本的gcc作為鏈接器;這里筆者就不展開了。文章來源:http://www.zghlxwxcb.cn/news/detail-829623.html
總結(jié)
這種修改、替換應(yīng)用使用的動態(tài)鏈接器(從而間接指定使用的glibc動態(tài)庫)的方法,可以方便地為老系統(tǒng)安裝一些新的應(yīng)用。在一些工作環(huán)境受限的條件下(如不能安裝新的系統(tǒng)作為開發(fā)環(huán)境),能夠讓我們不受過多的限制,不影響我們對開發(fā)工具的選擇。文章來源地址http://www.zghlxwxcb.cn/news/detail-829623.html
到了這里,關(guān)于在Ubuntu-12.04環(huán)境下使用新的Rust開發(fā)工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!