我需要单独构建一个 libsystemd.so ,但我发现手动构建和编写 spec 文件后用 rpmbuild 构建出来的 libsystemd.so.0.35.0 不同,rpmbuild 构建出来始终多一个 libgcc_s.so.1 的依赖:
build/libsystemd.so.0.35.0:
linux-vdso.so.1 (0x0000ffffb5d77000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000ffffb5ab0000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x0000ffffb5a50000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x0000ffffb5980000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffffb57b0000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb5d2a000)
# 以上是手动构建效果,没有 libgcc_s.so.1
# 以下是 rpmbuild 构建效果,强行塞了个 libgcc_s.so.1 进去
../BUILD/systemd-252/build/libsystemd.so.0.35.0:
linux-vdso.so.1 (0x0000ffff92396000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000ffff921f0000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x0000ffff92190000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x0000ffff920c0000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000ffff92060000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff91e90000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff92349000)
这对于想构建一个只依赖于 glibc 和其他文件体积不大的必备依赖的 libsystemd.so.0.35.0 来说是不可接受的。
既然手动构建没有添加 libgcc_s.so.1 ,那么问题应该出在 rpmbuild 上,他会用某种方式向 meson 或 ninja 构建时传递了什么参数或选项导致(应该不是往构建规则文件中写入内容),我上网查找了下,可能导致 libgcc 被添加的是一些 gcc 构建选项比如:
-Wl,--no-whole-archive
-Wl,--no-as-needed
--with-pie=no
...
但网上查了下,如果不往 meson 有关构建文件添加这类信息的话,不会出现构建出来多一个依赖的情况,我对这东西不太了解,网上查了半天测试半天没什么头绪,有没有熟悉这方面的大佬解惑?提前感谢!
我试了下还挺好复现问题的(后文涉及的很多段命令挂好代理后可以全选直接复制运行):
systemctl stop dnf-makecache.timer
systemctl disable dnf-makecache.timer
sed -e 's|^metalink=|#metalink=|g' \
-e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.ustc.edu.cn/fedora|g' \
-i.bak \
/etc/yum.repos.d/fedora.repo \
/etc/yum.repos.d/fedora-modular.repo \
/etc/yum.repos.d/fedora-updates.repo \
/etc/yum.repos.d/fedora-updates-modular.repo
dnf makecache
dnf update
dnf install wget nano tree -y
dnf groupinstall "Development Tools" -y
dnf install texinfo gcc-c++ perl -y
[ -f /usr/bin/yacc ] && mv /usr/bin/yacc /usr/bin/yacc.bak
ln -s /usr/bin/bison /usr/bin/yacc
dnf install meson gperf python3.12 python3-pip libcap-devel libmount-devel cmake -y
dnf install fedora-packager rpmdevtools -y
su - build
cd /home/build
rpmdev-setuptree
rpmdev-newspec -o ~/rpmbuild/SPECS/test.spec
cat > ~/rpmbuild/SPECS/test.spec << EOF
Name: aaa
Version: 1.0.0
Release: 1%{?dist}
Summary: aaa
License: GPLv3
%global s0_dir systemd-252
Source0: %{s0_dir}.tar.gz
#Source1: systemd-252-security_fix-1.patch
%description
%prep
rm -rf %{_builddir}/%{s0_dir}
%setup -q -T -D -n %{s0_dir} -b 0
%build
cd %{_builddir}/%{s0_dir}
#patch -Np1 -i %{S:1}
meson build
soName=\$(find build -maxdepth 1 -type d -name libsystemd.so* | sed 's#build/##; s#.p\$##')
ninja -C build \${soName}
# 这里加上退出是到构建操作结束直接停止,减少后续不必要的构建 rpm 软件包时的大量内容输出
exit 123
%install
%pre
%post
%preun
%postun
%files
%changelog
%autochangelog
EOF
wget -P ~ https://github.com/systemd/systemd/archive/v252/systemd-252.tar.gz
cp -rp ~/systemd-252.tar.gz ~/rpmbuild/SOURCES
cd ~
rm -rf ~/systemd-252
tar xfv ~/systemd-252.tar.gz
cd ~/systemd-252
meson build
soName=$(find build -maxdepth 1 -type d -name libsystemd.so* | sed 's#build/##; s#.p$##')
ninja -C build ${soName}
# 以上手动构建
# 以下自动构建
rpmbuild -D '_topdir /home/build/rpmbuild' -bb ~/rpmbuild/SPECS/test.spec
ldd ~/systemd-252/build/libsystemd.so*
# 以上手动构建检查
# 以下自动构建检查
ldd ~/rpmbuild/BUILD/systemd-252/build/libsystemd.so*
输出信息多还没高亮,而且超两万字限制了发不出来,建议本地复现检查
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.