LikeGiver

LikeGiver

ubuntu上软件运行的一些笔记

2023-12-20

背景:

最近遇到EasyConnect在linux上无法使用问题

我们学校的校园vpn使用Easyconnect,但是很久没维护了,我在ubuntu20.04上使用点击图标无反应

在/usr/share/sangfor/EasyConnect中直接terminal启动,报错显示Harfbuzz version too old (1.4.2)

网上查阅教程,最简单的方式是在该文件夹原地建立一个lib,里面放上合适版本的Harfbuzz和Pango

参考教程:https://www.cnblogs.com/4geek/p/13085039.html

lib下载链接: 百度网盘 提取码: hx54

思考:

主要涉及ELF可执行文件的一些知识,就是ubuntu上deb文件安装后会转化成ELF这种可执行的二进制文件,然后用ldd命令加ELF文件可以看到ELF文件依赖的动态链接库(so文件),即软件运行的依赖关系,之后遇到依赖相关问题可以通过增补对应版本so文件解决

2024.01.28更新:

最近又翻以前的书《Linux是怎样工作的》,第二章有ldd命令的示例:

查看echo命令的依赖:

(base) ➜  2024_1 ldd /bin/echo

	linux-vdso.so.1 (0x00007ffdec3d2000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5b21e25000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5b22041000)

其中libc指的就是c标准库

查看python3命令的依赖:

(base) ➜  2024_1 ldd /usr/bin/python3

	linux-vdso.so.1 (0x00007fffc5983000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f14ce5d3000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f14ce5b0000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f14ce5aa000)
	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f14ce5a5000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f14ce456000)
	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f14ce428000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f14ce40a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f14ce7e4000)

会发现python3命令同样依赖于libc,g++同理:

(base) ➜  2024_1 ldd /usr/bin/g++    

	linux-vdso.so.1 (0x00007ffd64de0000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2479fd0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f247a1e1000)

要注意的是,g++作为C++代码的编译器,本身并不依赖于C++标准库(libstdc++.so.6),g++ 在执行编译过程时不需要 C++ 标准库的功能,如果我们用ldd查看编译后的c++程序(hello程序)会发现有c++标准库了:

(base) ➜  2024_1 ldd ./hello
	linux-vdso.so.1 (0x00007ffdb8362000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f25e1907000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f25e1715000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f25e15c6000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f25e1b0d000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f25e15ab000)

根据chatgpt:g++ 不依赖于 C++ 标准库是因为它在编译代码时不需要标准库提供的功能。然而,它会确保编译后的程序能够与 C++ 标准库正确链接,使得这些程序能够在运行时使用标准库的功能。