[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: