Bug#1093594: binutils: move gprofng out of binutils-<triplet>
Source: binutils
Version: 2.43.50.20250108-1
Tags: patch
X-Debbugs-Cc: cjwatson@debian.org, debian-cross@lists.debian.org
Hi Matthias,
I recently mentioned binutils multiarch problem to you and promised a
patch. With much delay, here we go.
Let me start from where I saw the problem and then move into the messy
details. If you build targeted cross binutils (i.e. nothing a buildd
would ever do), you receive binutils-<targettriplet> and
binutils-for-host:<targetarch>. The latter depends on the former and
both depend on binutils-common. While the former can satisfy its
dependency from the host, the latter cannot and thus binutils-for-host
becomes uninstallable. This is unfortunate.
Fundamentally, there are two ways out of this misery. One is making
binutils-common Multi-Arch: foreign (and thus also reusing the host's)
and the other is also building it. To figure this out, we need a bit of
history. I am the one who originally added the binutils-common binary
package. The reason was that both binutils and binutils-<triplet> need
to refer to manual pages and locales and they as binutils was about to
depend on binutils-<triple>, binutils-<triplet> could no longer depend
on binutils. I originally proposed it as Arch:all, but Matthias kindly
pointed out that if buildds would finish at different times, buildds
would break for not being able to install build-essential and thus
Matthias changed to Arch:any before it could cause any harm. Eventually
it became M-A:same rather than M-A:foreign. Now we could simply change
it to M-A:foreign, right?
No. Back then all architectures would support gold, but gold is
deprecated and e.g. riscv64 doesn't support gold. As a result, the
riscv64 binutils-common package lacks locales for gold. Later, gprofng
was added and binutils-common includes its manual pages on amd64 and
arm64 but not on armel nor armhf. So unfortunately, binutils-common is
no longer M-A:foreign as its content varies per architecture.
I then looked into building binutils-common and that turned out to be a
problem. If building binutils-common:amd64, we'd want to include the
gprofng bits of course (or it would be unreproducible), but the upstream
configure requires that both host and target are amd64 (or arm64) in
order for it to actually build gprofng. Therefore, we'd have to add
gcc-x86-64-linux-gnu [armel armhf ...] to Build-Depends and those
packages do not exist nor do we want the native binutils build to depend
on cross toolchains. So no we cannot.
So it seems like we really cannot fix this. I reached out to Colin and
Johannes for ideas and in those discussions it became clear that
binutils-<triplet> actually does not reliably provide gprofng. For
instance, binutils-x86-64-linux-gnu:arm64 would miss gprofng. Actually,
providing gprofng in a non-native setting doesn't make much sense in the
first place, but that really means that it should not be part of
binutils-<triplet> ever. It already is not in the cross case, so what I
am proposing now is removing gprofng from binutils-<triplet> (and as a
result from binutils-common). The right package to put it to likely is
plain binutils, which still exists as a container of symlinks presently,
but there is little reason for it not to carry gprofng.
I'm attaching a patch that performs this move. Once this patch has been
accepted, we can move forward with the other problems. We may then build
a -common package that contains gold even on riscv64 or we may produce a
-common package as part of the targeted cross binutils build. I'm not
sure which of these is better at this time, but both variants require
that we move gprofng out of there.
What this patch also does is remove the triplet-prefixed gprofng as
arguably it can only be used natively in the first place. I performed
test builds of binutils on amd64, arm64, armel, armhf, i386, ran
lintian, piuparts and autopkgtests (including those for rdeps). I looked
into some of the autopkgtest failures, but the sample I looked at where
not caused by my change or already reported. Before applying the patch,
you should sed -i -e 's/\(999:\)\?0TODO/$actual_binutils_version/' on
the patch file. The addition of binutils-dbg incurs a trip through NEW.
Helmut
diff --minimal -Nru binutils-2.43.50.20250108/debian/binutils-common.conffiles binutils-2.43.50.20250108/debian/binutils-common.conffiles
--- binutils-2.43.50.20250108/debian/binutils-common.conffiles 2022-09-29 11:39:27.000000000 +0200
+++ binutils-2.43.50.20250108/debian/binutils-common.conffiles 2025-01-17 18:09:28.000000000 +0100
@@ -1 +1 @@
-/etc/gprofng.rc
+remove-on-upgrade /etc/gprofng.rc
diff --minimal -Nru binutils-2.43.50.20250108/debian/binutils.conffiles binutils-2.43.50.20250108/debian/binutils.conffiles
--- binutils-2.43.50.20250108/debian/binutils.conffiles 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.43.50.20250108/debian/binutils.conffiles 2022-09-29 11:39:27.000000000 +0200
@@ -0,0 +1 @@
+/etc/gprofng.rc
diff --minimal -Nru binutils-2.43.50.20250108/debian/binutils.preinst binutils-2.43.50.20250108/debian/binutils.preinst
--- binutils-2.43.50.20250108/debian/binutils.preinst 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.43.50.20250108/debian/binutils.preinst 2025-01-17 18:09:28.000000000 +0100
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if test "$1" = upgrade &&
+ test -e /etc/gprofng.rc.dpkg-old &&
+ ! test -e /etc/gprofng.rc &&
+ dpkg --compare-cversions "$2" lt "999:0TODO"
+then
+ # Moving gprofng.rc from binutils-common to binutils.
+ mv /etc/gprofng.rc.dpkg-old /etc/gprofng.rc
+fi
+
+exit 0
diff --minimal -Nru binutils-2.43.50.20250108/debian/changelog binutils-2.43.50.20250108/debian/changelog
--- binutils-2.43.50.20250108/debian/changelog 2025-01-09 00:34:21.000000000 +0100
+++ binutils-2.43.50.20250108/debian/changelog 2025-01-17 18:09:28.000000000 +0100
@@ -1,3 +1,10 @@
+binutils (2.43.50.20250108-1.1) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload.
+ * Move gprofng to binutils. (Closes: #-1)
+
+ -- Helmut Grohne <helmut@subdivi.de> Fri, 17 Jan 2025 18:09:28 +0100
+
binutils (2.43.50.20250108-1) unstable; urgency=medium
* New upstream snapshot, taken from the trunk.
diff --minimal -Nru binutils-2.43.50.20250108/debian/control binutils-2.43.50.20250108/debian/control
--- binutils-2.43.50.20250108/debian/control 2024-12-30 12:46:20.000000000 +0100
+++ binutils-2.43.50.20250108/debian/control 2025-01-17 18:09:28.000000000 +0100
@@ -65,11 +65,30 @@
binutils-multiarch (<< 2.27-8)
Provides: elf-binutils, ${gold:Provides}
Suggests: binutils-doc (>= ${source:Version}), gprofng-gui
+Breaks:
+ binutils-aarch64-linux-gnu (<< 0TODO),
+ binutils-i686-linux-gnu (<< 0TODO),
+ binutils-riscv64-linux-gnu (<< 0TODO),
+ binutils-x86-64-linux-gnu (<< 0TODO),
+Replaces:
+ binutils-common (<< 999:0TODO),
+ binutils-aarch64-linux-gnu (<< 999:0TODO),
+ binutils-i686-linux-gnu (<< 999:0TODO),
+ binutils-riscv64-linux-gnu (<< 999:0TODO),
+ binutils-x86-64-linux-gnu (<< 999:0TODO),
Description: GNU assembler, linker and binary utilities
The programs in this package are used to assemble, link and manipulate
binary and object files. They may be used in conjunction with a compiler
and various libraries to build programs.
+Package: binutils-dbg
+Section: debug
+Priority: optional
+Architecture: amd64 arm64 i386 riscv64
+Depends: binutils (= ${binary:Version}), ${binutils:native}-dbg (= ${binary:Version})
+Description: GNU assembler, linker and binary utilities(debug symbols)
+ This package provides debug symbols for binutils.
+
Package: libctf-nobfd0
Architecture: any
Multi-Arch: same
diff --minimal -Nru binutils-2.43.50.20250108/debian/control.in binutils-2.43.50.20250108/debian/control.in
--- binutils-2.43.50.20250108/debian/control.in 2024-12-30 12:44:18.000000000 +0100
+++ binutils-2.43.50.20250108/debian/control.in 2025-01-17 18:09:28.000000000 +0100
@@ -65,11 +65,30 @@
binutils-multiarch (<< 2.27-8)
Provides: elf-binutils, ${gold:Provides}
Suggests: binutils-doc (>= ${source:Version}), gprofng-gui
+Breaks:
+ binutils-aarch64-linux-gnu (<< 0TODO),
+ binutils-i686-linux-gnu (<< 0TODO),
+ binutils-riscv64-linux-gnu (<< 0TODO),
+ binutils-x86-64-linux-gnu (<< 0TODO),
+Replaces:
+ binutils-common (<< 999:0TODO),
+ binutils-aarch64-linux-gnu (<< 999:0TODO),
+ binutils-i686-linux-gnu (<< 999:0TODO),
+ binutils-riscv64-linux-gnu (<< 999:0TODO),
+ binutils-x86-64-linux-gnu (<< 999:0TODO),
Description: GNU assembler, linker and binary utilities
The programs in this package are used to assemble, link and manipulate
binary and object files. They may be used in conjunction with a compiler
and various libraries to build programs.
+Package: binutils-dbg
+Section: debug
+Priority: optional
+Architecture: amd64 arm64 i386 riscv64
+Depends: binutils (= ${binary:Version}), ${binutils:native}-dbg (= ${binary:Version})
+Description: GNU assembler, linker and binary utilities(debug symbols)
+ This package provides debug symbols for binutils.
+
Package: libctf-nobfd0
Architecture: any
Multi-Arch: same
diff --minimal -Nru binutils-2.43.50.20250108/debian/rules binutils-2.43.50.20250108/debian/rules
--- binutils-2.43.50.20250108/debian/rules 2024-12-04 17:12:57.000000000 +0100
+++ binutils-2.43.50.20250108/debian/rules 2025-01-17 18:09:28.000000000 +0100
@@ -456,7 +456,7 @@
rm -rf stamps
find . -name \*.gmo -o -name \*~ -o -name \*.info ! -name sysroff.info | xargs -r rm -f
rm -f test-summary*
- rm -rf $(d_bin) $(d_com) $(d_lib) $(d_lib)-dbg $(d_nat) $(d_nat)-dbg \
+ rm -rf $(d_bin) $(d_bin)-dbg $(d_com) $(d_lib) $(d_lib)-dbg $(d_nat) $(d_nat)-dbg \
$(d_hst) $(d_dev) $(d_mul) $(d_mul)-dbg $(d_mdev) $(d_doc) \
$(d_hppa64) $(d_hppa64)-dbg $(d_src) $(d_bld) \
$(d_ctf) $(d_ctf)-dbg $(d_ctfn) $(d_ctfn)-dbg $(d_gpng) $(d_gpng)-dbg \
@@ -1012,10 +1012,13 @@
mv $(d_bin)/$(PF)/lib/$(DEB_HOST_MULTIARCH)/ldscripts \
$(d_nat)/$(PF)/lib/$(DEB_HOST_MULTIARCH)/.
- $(install_dir) $(d_com)/$(PF)/share/man
- mv $(d_bin)/$(PF)/share/man/man1 $(d_com)/$(PF)/share/man/.
- for f in $(d_com)/$(PF)/share/man/man1/*.1; do \
+ $(install_dir) $(d_com)/$(PF)/share/man/man1
+ set -e; for f in $(d_bin)/$(PF)/share/man/man1/*.1; do \
sed -i -e '/^\.TH /s/[0-9]*-[0-9]*-[0-9]*/$(BUILD_DAY)/' $$f; \
+ case "$$f" in \
+ *gprofng*) ;; \
+ *) mv "$$f" '$(d_com)/$(PF)/share/man/man1/' ;; \
+ esac; \
done
ifeq ($(with_gprofng),yes)
@@ -1254,11 +1257,6 @@
rmdir $(d_bin)/$(PF)/include/
ifeq ($(with_gprofng),yes)
- $(install_dir) $(d_com)/etc
- mv $(d_bin)/etc/gprofng.rc $(d_com)/etc/.
-endif
-
-ifeq ($(with_gprofng),yes)
: # Remove the gp-* compat symlinks
rm -f $(PF)/bin/gp-*
endif
@@ -1277,6 +1275,9 @@
done
ifeq ($(with_native),yes)
$(call strip_package, $(p_nat), $(d_nat))
+ ifeq ($(with_gprofng),yes)
+ $(call strip_package, $(p_bin), $(d_bin))
+ endif
endif
ifeq ($(with_multiarch),yes)
for i in \
@@ -1605,7 +1606,8 @@
endif
: # install maintainer scripts
- $(install_dir) $(d_bin)/DEBIAN
+ $(install_dir) $(d_bin)/DEBIAN $(d_bin)-dbg/DEBIAN
+ $(install_script) debian/binutils.preinst $(d_bin)/DEBIAN/preinst
$(install_dir) $(d_lib)/DEBIAN $(d_lib)-dbg/DEBIAN
$(install_file) debian/binutils.triggers $(d_lib)/DEBIAN/triggers
@@ -1621,13 +1623,15 @@
$(install_file) debian/libctf-nobfd0.shlibs $(d_ctfn)/DEBIAN/shlibs
$(install_file) debian/libctf-nobfd0.symbols $(d_ctfn)/DEBIAN/symbols
+ $(install_dir) $(d_com)/DEBIAN
+ $(install_file) debian/binutils-common.conffiles $(d_com)/DEBIAN/conffiles
+
ifeq ($(with_gprofng),yes)
$(install_dir) $(d_gpng)/DEBIAN $(d_gpng)-dbg/DEBIAN
$(install_file) debian/binutils.triggers $(d_gpng)/DEBIAN/triggers
$(install_file) debian/libgprofng0.shlibs $(d_gpng)/DEBIAN/shlibs
- $(install_dir) $(d_com)/DEBIAN
- $(install_file) debian/binutils-common.conffiles $(d_com)/DEBIAN/conffiles
+ $(install_file) debian/binutils.conffiles $(d_bin)/DEBIAN/conffiles
endif
$(install_dir) $(d_sfrm)/DEBIAN $(d_sfrm)-dbg/DEBIAN
$(install_file) debian/binutils.triggers $(d_sfrm)/DEBIAN/triggers
@@ -1753,10 +1757,16 @@
find $(d_com)/$(PF)/share/doc/$(p_bin)/ -type f ! -name bbconv.pl | xargs gzip -9n
gzip -9n $(d_com)/$(PF)/share/doc/$(p_com)/changelog.Debian
gzip -9n $(d_com)/$(PF)/share/man/man1/*.1
+ifeq ($(with_gprofng),yes)
+ gzip -9n $(d_bin)/$(PF)/share/man/man1/*.1
+endif
gzip -9n $(d_sfrm)/$(PF)/share/doc/$(p_sfrm)/changelog.Debian
: # Finish it all up
+ifeq ($(with_gprofng),yes)
+ find $(d_bin) -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps
+endif
dpkg-gencontrol -P$(d_bin) -p$(p_bin) \
$(CONFLICTS_TARGET_$(DEB_HOST_ARCH)) $(gold_provides) \
-Vbinutils:native=$(p_nat)
@@ -1797,6 +1807,8 @@
cd $(d_gpng) && find -type f ! -regex './DEBIAN/.*' -printf '%P\n' | LC_ALL=C sort | xargs md5sum > DEBIAN/md5sums
dpkg-gencontrol -P$(d_gpng)-dbg -p$(p_gpng)-dbg
cd $(d_gpng)-dbg && find -type f ! -regex './DEBIAN/.*' -printf '%P\n' | LC_ALL=C sort | xargs md5sum > DEBIAN/md5sums
+ dpkg-gencontrol -P$(d_bin)-dbg -p$(p_bin)-dbg -Vbinutils:native=$(p_nat)
+ cd $(d_bin)-dbg && find -type f ! -regex './DEBIAN/.*' -printf '%P\n' | LC_ALL=C sort | xargs md5sum > DEBIAN/md5sums
endif
rm -f debian/substvars
@@ -1866,14 +1878,17 @@
xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
$(DPKG_DEB) --build $(d_ctfn)-dbg ..
ifeq ($(with_gprofng),yes)
- $(CHOWN) -R root:root $(d_gpng) $(d_gpng)-dbg
- chmod -R go=rX $(d_gpng) $(d_gpng)-dbg
+ $(CHOWN) -R root:root $(d_gpng) $(d_gpng)-dbg $(d_bin)-dbg
+ chmod -R go=rX $(d_gpng) $(d_gpng)-dbg $(d_bin)-dbg
find $(d_gpng) -depth -newermt '$(BUILD_DATE)' -print0 | \
xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
$(DPKG_DEB) --build $(d_gpng) ..
find $(d_gpng)-dbg -depth -newermt '$(BUILD_DATE)' -print0 | \
xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
$(DPKG_DEB) --build $(d_gpng)-dbg ..
+ find $(d_bin)-dbg -depth -newermt '$(BUILD_DATE)' -print0 | \
+ xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
+ $(DPKG_DEB) --build $(d_bin)-dbg ..
endif
find $(d_sfrm) -depth -newermt '$(BUILD_DATE)' -print0 | \
xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
diff --minimal -Nru binutils-2.43.50.20250108/debian/rules.defs binutils-2.43.50.20250108/debian/rules.defs
--- binutils-2.43.50.20250108/debian/rules.defs 2024-11-26 13:02:34.000000000 +0100
+++ binutils-2.43.50.20250108/debian/rules.defs 2025-01-17 18:09:28.000000000 +0100
@@ -34,10 +34,6 @@
binutils_programs = addr2line ar as c++filt elfedit gprof ld ld.bfd
binutils_programs += nm objcopy objdump ranlib readelf size strings strip
-ifeq ($(with_gprofng),yes)
- binutils_programs += gprofng gprofng-collect-app gprofng-archive
- binutils_programs += gprofng-display-html gprofng-display-src gprofng-display-text
-endif
ifeq ($(with_gold),yes)
binutils_programs += gold ld.gold dwp
endif
Reply to: