在Ubuntu-12.04环境下使用新的Rust开发工具

这篇具有很好参考价值的文章主要介绍了在Ubuntu-12.04环境下使用新的Rust开发工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在老旧的系统环境下使用Rust开发工具

笔者的一台硬件资源紧张的旧电脑安装了Ubuntu-12.04,希望在其上运行比较新的Rust开发工具,但却发现其因glibc较老,不能正常运行cargo工具,结果如下:

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可执行文件对glibc最低版本要求是GLIBC_2.17,而Ubuntu-12.04系统的glibc版本较低,因此不能正常运行。一种可行的解决方法是使用docker容量在Ubuntu-12.04系统下使用新的Rust开发工具;但限于笔者对docker了解程度比较浅,并没有尝试该方法。笔者想到的方法也比较简单直接(此前的博客对该方法有相关的说明):在Ubuntu-12.04系统上安装Ubuntu-22.04系统的glibc动态库(不替换原先的glibc库),之后修改Rust开发工具的可执行文件,强制其依赖新的glibc库。

在Ubuntu-22.04下载并解压新的glibc动态库

首先,笔者需要另一台安装了较新版本Ubuntu的系统环境(Ubuntu-22.04),使用apt-get download命令下载四个相关的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系统中安装的动态库。以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文件夹,其中包含了我们想要的动态库。对另外三个deb需要重复这个解压的操作。最后将所有的动态库全部都集中到./lib64文件夹下,复制到Ubuntu-12.04系统中(注意软链接的复制)。笔者得到的lib64文件夹中的内容有(多了一些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系统上修改新的glibc

笔者在Ubuntu-12.04系统下创建了/home/user/x64_libs文件夹,并将lib64文件夹复制到该目录。之后笔者通过modify.sh脚本,直接修改了lib64中的动态库:

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调用了笔者编写的一个简单的hed工具,用于批量替换二进制文件中的字符串或二进制数据(有需要可以联系笔者),该脚本的内容如下:

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开发工具了。

修改安装于Ubuntu-12.04系统上的Rust工具链

笔者将Rust开发工具链安装到了/opt/rust-lang路径下(可参考笔者之前的相关博客);实际上,这个工具链是在Ubuntu-22.04下安装的,之后笔者将其打包复制到了Ubuntu-12.04系统中。执行以下命令,可以批量替换/opt/rust-lang路径下的可执行文件使用的动态链接器(从而强制其使用在Ubuntu-22.04系统下载的新的glibc动态库):

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

以上命令执行完成后,就可以在Ubuntu-12.04系统中正常使用新版本的Rust开发工具了:

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系统安装的gcc版本太老了,它作为Rust在编译构建时的链接器,可能会存在链接失败的问题。不过针对这个潜在的问题,我们仍有解决方案:从此处下载新版本的gcc编译器,通过TARGET_CC这一与Rust编译链接相关的环境变量强制其使用新版本的gcc作为链接器;这里笔者就不展开了。

总结

这种修改、替换应用使用的动态链接器(从而间接指定使用的glibc动态库)的方法,可以方便地为老系统安装一些新的应用。在一些工作环境受限的条件下(如不能安装新的系统作为开发环境),能够让我们不受过多的限制,不影响我们对开发工具的选择。文章来源地址https://www.toymoban.com/news/detail-829623.html

到了这里,关于在Ubuntu-12.04环境下使用新的Rust开发工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Rust开发命令行工具

    生成二进制文件,将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具 [1] 找到合适的API 使用 该api [2] 如请求 api.openweathermap.org/data/2.5/weather?q=Beijingappid=your_key : 初始化项目coding 使用 cargo new rust_weather 初始化一个项目。 对于 cargo.toml 文件: 对于 src/main.rs 文件: 使用

    2024年02月11日
    浏览(27)
  • ubuntu20.04 ROS 环境下使用velodyne激光雷达

    系统版本:ubuntu 20.04 ROS版本:noetic 激光雷达型号:velodyne VLP-16 网线接 PC/工控机 端口 将PC/工控机的网口配置为: ipv4,方式设置为手动 ip地址、掩码以及网关设置成下图 查看当前话题 其中 /velodyne_points 就是 激光雷达发布的点云消息。 终端输入rviz Fiex Frame 写入 velodyne 添加

    2024年02月08日
    浏览(44)
  • 如何在 Ubuntu 20.04 上安装 Rust

    前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 Rust 编程语言,是一种功能强大的通用编程语言。Rust 在语法上与C++类似,用于广泛的软件开发项目,包括浏览器组件、游戏引擎和操作系统。

    2024年04月15日
    浏览(58)
  • ubuntu22.04 x86环境上使用QEMU搭建arm虚拟机

    apt-get -y install qemu apt-get -y install bridge-utils apt-get -y install vnc4server apt-get -y install qemu-kvm apt install -y qemu-system-arm apt-get -y install libvirt0 apt-get -y install libvirt-daemon apt-get -y install libvirt-daemon-system 安装完成后检查: virsh version ls /usr/bin/|grep qemu wget http://releases.linaro.org/components/kernel/

    2024年02月07日
    浏览(64)
  • fabric 环境快速搭建--Ubuntu20.04系统下使用fabric官方脚本搭建

    由于是初识hyper ledger fabric在安装的时候遇到了很多的问题,最后在师兄的帮助下终于删了从头到尾安装了一遍,因此想记录一下,并且给和我遇到相同问题的小伙伴提供一些帮助。如果你是萌新,找我就对啦! 直接去官方下载即可 其他帖子上面有很多详细步骤,这里不多赘

    2024年02月14日
    浏览(31)
  • 新的Ubuntu服务器上如何安装深度学习环境的docker

    背景: 硬件:联想的双3090显卡 总共 48GB显存 4TB 刀片式服务器。 软件:只安装了nvidia的驱动,能用nvidia-smi查看显卡信息,但是 nvcc -V看不到东西。 镜像包是 nvidia_cu11_tf15.tar,里面包含 公司nvidia驱动和环境里的TensorFlow,torch 是不一样的。一开始担心 是不是 要 降级 Ubuntu下的

    2024年02月10日
    浏览(48)
  • Ubuntu20.04卸载cuda12.0

    刚装cuda的时候没仔细看版本,默认安装了cuda12.0,然后发现pytorch并不支持12.0的版本,于是卸载重装,先贴解决办法再吐槽:解决办法是参考的Nvidia官方文档 只需要两步: 官方文档中实际上是三步: 其中第二步是用来卸载nvidia驱动的,但是我想保留驱动而只卸载cuda所以就跳过了

    2024年02月11日
    浏览(41)
  • Ubuntu20.04安装cuda12.11

    首先就是安装显卡驱动,我是双3090,不知道为什么,官网死活安不上,最后从软件更新那里直接安装上了,绷不住了 首先从官网下载runfile文件 安装的时候记得驱动和Kernel Objects 和 nvidia-fs不选 然后全剧终 等等,你还需要vim .bashrc,加入(版本替换成自己的) 改成清华源直接安

    2024年01月23日
    浏览(68)
  • Ubuntu22.04安装NVIDIA驱动2022.12.25

    lspci | grep -i nvidia 在官网中选择合适自己的显卡下载对应驱动 下载地址 需要安装 g++ gcc make三个依赖包 在安装g++时遇到错误 :you do not appear to have libc header files install on your system 解决: 如果遇到: 下列软件包有未满足的依赖关系: libc6-dev : 依赖: libc6 (= 2.27-3ubuntu1.6) 但是 2.

    2024年02月04日
    浏览(37)
  • 关于Ubuntu22.04,ros2-humble环境下,使用gazebo遇到的问题。

    遇到的问题: 打开gazebo时出现error:process has died的报错,虽然仍然可以打开gazebo,但是gazebo显示的并不是launch文件调用的world文件与urdf文件内容,可能显示前次使用gazebo时的内容,或者出现机器人模型乱转的情况。 问题原因: 前次使用gazebo后,没有完全关闭gazebo,尤其是

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包