Ubuntu Server 22.04.4 LTS下寻找同时安装静态/动态链接版本程序的方法咨询
Ubuntu Server 22.04.4 LTS下寻找同时安装静态/动态链接版本程序的方法咨询
你说得太对啦!现在主流Linux发行版(包括Ubuntu Server 22.04)里,默认提供的程序几乎都是动态链接的——毕竟动态链接能节省磁盘空间、方便共享库的更新维护,静态链接的程序确实越来越少见了。不过还是有一些办法能找到或者生成同时存在两种版本的程序,下面给你一步步说:
一、寻找仓库中自带双版本的程序
Ubuntu的软件仓库里还是有少数工具同时提供动态和静态链接的包,比如:
- busybox:默认安装的是动态链接版(路径通常是
/bin/busybox),你可以通过sudo apt install busybox-static安装静态链接版本,安装完成后静态版一般在/usr/bin/busybox-static - wget:同样,默认是动态版(
/usr/bin/wget),执行sudo apt install wget-static就能得到静态版的/usr/bin/wget-static
二、验证程序的链接类型
拿到程序路径后,你可以用这两个命令确认是静态还是动态链接:
- 用
file命令:比如file /bin/busybox,动态链接的程序会显示类似“ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=xxx, for GNU/Linux 3.2.0, stripped”;静态链接的则会显示“statically linked” - 用
ldd命令:如果是静态链接程序,执行ldd /usr/bin/busybox-static会输出“not a dynamic executable”;动态链接的程序则会列出所有依赖的共享库
三、对比两个版本的大小
直接用ls -lh命令就能直观看到文件大小差异,比如:
ls -lh /bin/busybox /usr/bin/busybox-static
输出里会显示两个文件的大小、修改时间等信息,静态版通常会比动态版大很多,因为它把所有依赖的库都打包进了程序本身。
四、列出动态链接程序的依赖库
还是用ldd命令,比如查看动态版wget的依赖:
ldd /usr/bin/wget
命令会输出所有依赖的共享库路径、名称,以及对应的系统库位置。
五、手动编译生成静态版本(如果找不到现成的)
如果某个程序仓库里没有静态版,你也可以自己下载源码编译:
- 先安装编译依赖,比如
sudo apt install build-essential - 下载程序源码(比如从官方网站或者git仓库)
- 编译时加上
-static参数,比如用gcc编译C程序:gcc -static your_program.c -o your_program-static
这样就能得到静态链接的版本,和系统里默认的动态版对比啦。
备注:内容来源于stack exchange,提问作者Krecikkko
相关产品推荐
相关产品推荐

