- 工具信息
- 主机:VMwareWorkstation或VirtualBox + CentOS Linux release 8.5.2111
VMwareWorkstation或VirtualBox
自行安装
CentOS Linux release 8.5.2111
https://mirrors.aliyun.com/centos/8/isos/x86_64/
选择:CentOS-8.5.2111-x86_64-dvd1.iso
- pciutils: pciutils-3.10.0
http://mj.ucw.cz/download/linux/pci/pciutils-3.10.0.tar.gz
最新版本的pciutils从网站http://mj.ucw.cz/download/linux/pci/确定。
- 目的
有时系统自带的lspci不能满足使用需求,这时就需要编译新的lspci程序,默认编译的lspci是动态链接的,如果搞不清楚它所依赖的库,在直接拷贝到其它系统中可能导致lspci无法使用,如下是查看lspci是动态链接还是静态链接的方法:
[root@localhost jis1]# lspci --version lspci version 3.7.0 [root@localhost jis1]# which lspci /usr/sbin/lspci [root@localhost jis1]# file /usr/sbin/lspci /usr/sbin/lspci: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=a9e136ebd08537940151befd642752ef9222ee4e, stripped |
从命令“file /usr/sbin/lspci”执行结果中包括了“dynamically linked”可以看到lspci是动态链接的,本文旨在编译静态的lspci。
- 编译步骤
- 下载pciutils
从网站http://mj.ucw.cz/download/linux/pci/获取最新版本的pciutils,如目前最新版本为3.10.0
[root@localhost jis1]# wget http://mj.ucw.cz/download/linux/pci/pciutils-3.10.0.tar.gz --2023-07-30 08:19:46-- http://mj.ucw.cz/download/linux/pci/pciutils-3.10.0.tar.gz Resolving mj.ucw.cz (mj.ucw.cz)... 46.255.230.98, 2a00:da80:fff0:2::2 Connecting to mj.ucw.cz (mj.ucw.cz)|46.255.230.98|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 931711 (910K) [application/x-gzip] Saving to: ‘pciutils-3.10.0.tar.gz’
pciutils-3.10.0.tar.gz 100%[============================================================================>] 909.87K 99.2KB/s in 7.9s
2023-07-30 08:19:55 (116 KB/s) - ‘pciutils-3.10.0.tar.gz’ saved [931711/931711] |
- 解压并进入对应的目录
[root@localhost jis1]# tar xvf pciutils-3.10.0.tar.gz [root@localhost jis1]# cd pciutils-3.10.0/ [root@localhost pciutils-3.10.0]# |
- 修改顶层Makefile
修改顶层Makefile,“CFLAGS=”后加上-static选项,此处的-static选项表示编译单个.o文件时编译成静态链接库。
[root@localhost pciutils-3.10.0]# vi Makefile CFLAGS=$(OPT) -Wall -W -Wno-parentheses -Wstrict-prototypes -Wmissing-prototypes -static |
- 编译pciutils
- 编译pciutils
[root@localhost pciutils-3.10.0]# make SHARED=no ZLIB=no cd lib && ./configure … make -C lib all make[1]: Entering directory '/home/jis1/pciutils-3.10.0/lib' cc -O2 -Wall -W -Wno-parentheses -Wstrict-prototypes -Wmissing-prototypes -static -c -o init.o init.c cc -O2 -Wall -W -Wno-parentheses -Wstrict-prototypes -Wmissing-prototypes -static -c -o access.o access.c … cc lspci.o ls-vpd.o ls-caps.o ls-caps-vendor.o ls-ecaps.o ls-kernel.o ls-tree.o ls-map.o common.o lib/libpci.a -lresolv -o lspci … |
注:从编译输出的打印中可以看到,链接生成lspci的命令如下,后面手动生成静态链接的lspci以此命令为基础进行简单修改即可。
cc lspci.o ls-vpd.o ls-caps.o ls-caps-vendor.o ls-ecaps.o ls-kernel.o ls-tree.o ls-map.o common.o lib/libpci.a -lresolv -o lspci |
- 查看生成的lspci可执行程序,此时还是动态链接的
[root@localhost pciutils-3.10.0]# file lspci lspci: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=541c9d09788b10181f2d8a92b96137fffa31a7bc, not stripped |
- 手动生成静态链接的lspci可执行程序
把编译过程中链接生成lspci的cc修改成gcc, 再末尾添加-static就可以编译成静态的lspci程序,
[root@localhost pciutils-3.10.0]# gcc lspci.o ls-vpd.o ls-caps.o ls-caps-vendor.o ls-ecaps.o ls-kernel.o ls-tree.o ls-map.o common.o lib/libpci.a -lresolv -static -o lspci |
- 确认静态链接lspci可执行程序的版本号
- 确认静态链接属性和版本号
[root@localhost pciutils-3.10.0]# file lspci lspci: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=a64193c377b24c2d2c50fdac2981d5b9ea930381, not stripped, too many notes (256)
[root@localhost pciutils-3.10.0]# ./lspci --version lspci version 3.10.0
|
- 新编译的lspci可以正常使用
[root@localhost pciutils-3.10.0]# ./lspci -vvv -s 00:00.0 00:00.0 Class 0600: Device 8086:7190 (rev 01) Subsystem: Device 15ad:1976 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0
|