Porting Software – Get your RPM’s right.
The other day I was porting some C++ applications from Centos 7 to Fedora 25/27. Of course CMake helps with the compilation part. However, when I was standing up a new VM with Fedora 27, I wanted to quickly ensure I had the right libraries present on the system to check that compilation/linking would succeed.
I hadn’t got the stage of listing required dependencies for the package, otherwise rpm -qpR /path/to/rpm/file.rpm would be useful.
So I would normally execute the following commands on Centos 7 (where my executable was compiled) to see what RPM’s would need installing on Fedora 27 (where I was porting to).
1. ldd /path/to/executable to reveal the shared libs that are dynamically linked to the executable.
2. For every library path in ldd output, issue rpm -qf /library/path
This gets a bit monotonous after a while!! So I developed ldd2rpm. Basically its a small python program that uses rpm module to interrogate the rpm database.
Now you can do cool things like this.
0:27 $ ./ldd2rpm.py ../missile_run/build/missile_run systemd-libs-219-42.el7_4.10.x86_64 libXrender-0.9.10-1.el7.x86_64 freetype-2.4.11-15.el7.x86_64 libSM-1.2.2-2.el7.x86_64 zlib-1.2.7-17.el7.x86_64 libuuid-2.23.2-43.el7_4.2.x86_64 elfutils-libs-0.168-8.el7.x86_64 libxcb-1.12-1.el7.x86_64 libICE-1.0.9-9.el7.x86_64 libXau-1.0.8-2.1.el7.x86_64 xz-libs-5.2.2-1.el7.x86_64 flac-libs-1.3.0-5.el7_1.x86_64 libgcc-4.8.5-16.el7_4.2.x86_64 libvorbis-1:1.3.3-8.el7.x86_64 elfutils-libelf-0.168-8.el7.x86_64 openal-soft-1.16.0-3.el7.x86_64 libXrandr-1.5.1-2.el7.x86_64 glibc-2.17-196.el7_4.2.x86_64 libX11-1.6.5-1.el7.x86_64 libjpeg-turbo-1.2.90-5.el7.x86_64 libstdc++-4.8.5-16.el7_4.2.x86_64 libXcomposite-0.4.4-4.1.el7.x86_64 libXfixes-5.0.3-1.el7.x86_64 libattr-2.4.46-12.el7.x86_64 libXdamage-1.1.4-4.1.el7.x86_64 libXext-1.3.3-3.el7.x86_64 bzip2-libs-1.0.6-13.el7.x86_64 libogg-2:1.3.0-7.el7.x86_64 libcap-2.22-9.el7.x86_64
This output shows the RPM packages that provide the shared libraries dynamically linked to your executable. Now you have an idea of what RPM’s to install on the target system that you are porting to.
If you want a little more verbosity, add the -v flag to the command line.
0:12 $ ./ldd2rpm.py -v ../missile_run/build/missile_run systemd-libs-219-42.el7_4.10.x86_64 /lib64/libudev.so.1 libXrender-0.9.10-1.el7.x86_64 /lib64/libXrender.so.1 freetype-2.4.11-15.el7.x86_64 /lib64/libfreetype.so.6 libSM-1.2.2-2.el7.x86_64 /lib64/libSM.so.6 zlib-1.2.7-17.el7.x86_64 /lib64/libz.so.1 libuuid-2.23.2-43.el7_4.2.x86_64 /lib64/libuuid.so.1 elfutils-libs-0.168-8.el7.x86_64 /lib64/libdw.so.1 libxcb-1.12-1.el7.x86_64 /lib64/libxcb.so.1 libICE-1.0.9-9.el7.x86_64 /lib64/libICE.so.6 libXau-1.0.8-2.1.el7.x86_64 /lib64/libXau.so.6 xz-libs-5.2.2-1.el7.x86_64 /lib64/liblzma.so.5 flac-libs-1.3.0-5.el7_1.x86_64 /lib64/libFLAC.so.8 libgcc-4.8.5-16.el7_4.2.x86_64 /lib64/libgcc_s.so.1 libvorbis-1:1.3.3-8.el7.x86_64 /lib64/libvorbisenc.so.2 /lib64/libvorbisfile.so.3 /lib64/libvorbis.so.0 elfutils-libelf-0.168-8.el7.x86_64 /lib64/libelf.so.1 openal-soft-1.16.0-3.el7.x86_64 /lib64/libopenal.so.1 libXrandr-1.5.1-2.el7.x86_64 /lib64/libXrandr.so.2 glibc-2.17-196.el7_4.2.x86_64 /lib64/libm.so.6 /lib64/libc.so.6 /lib64/libpthread.so.0 /lib64/librt.so.1 /lib64/libdl.so.2 libX11-1.6.5-1.el7.x86_64 /lib64/libX11.so.6 libjpeg-turbo-1.2.90-5.el7.x86_64 /lib64/libjpeg.so.62 libstdc++-4.8.5-16.el7_4.2.x86_64 /lib64/libstdc++.so.6 libXcomposite-0.4.4-4.1.el7.x86_64 /lib64/libXcomposite.so.1 libXfixes-5.0.3-1.el7.x86_64 /lib64/libXfixes.so.3 libattr-2.4.46-12.el7.x86_64 /lib64/libattr.so.1 libXdamage-1.1.4-4.1.el7.x86_64 /lib64/libXdamage.so.1 libXext-1.3.3-3.el7.x86_64 /lib64/libXext.so.6 bzip2-libs-1.0.6-13.el7.x86_64 /lib64/libbz2.so.1 libogg-2:1.3.0-7.el7.x86_64 /lib64/libogg.so.0 libcap-2.22-9.el7.x86_64 /lib64/libcap.so.2
The first columns shows the RPM package name that provides the shared library dynamically linked to the executable.
The second column shows the path of the shared library.
This code is available on Bitbucket, along with further description and examples.
Enjoy !!