Package: binutils
Version: 2.19-1~exp2
Followup-For: Bug #497603

I finally had a chance to look at this.  The problem appears to be
that binutils-multiarch does not provide diversions to point the .so
links to the multiarch shared libraries.

I think the best thing to do is to create a binutils-multiarch-dev
package which installs and diverts the static libraries and the
correct shared library links.  It depends on the binutils-multiarch
and binutils-dev (this approach allows binutils-multiarch to not pull
in binutils-dev).

With the attached patch, I get the following behaviour

1) system in normal state, no -dev packages

r...@jj:/tmp# ls -l /usr/lib/libbfd* /usr/lib/libopcode*
-rw-r--r-- 1 root root 942680 2008-11-30 05:03 /usr/lib/libbfd-2.19.so
-rw-r--r-- 1 root root 552376 2008-11-30 05:03 /usr/lib/libopcodes-2.19.so

2) dpkg -i binutils-dev_2.19-1~exp2_i386.deb

Dev package install static libraries and "normal" links to shared
libraries.

r...@jj:/tmp# ls -l /usr/lib/libbfd* /usr/lib/libopcode*
-rw-r--r-- 1 root root  942680 2008-11-30 05:03 /usr/lib/libbfd-2.19.so
-rw-r--r-- 1 root root 6818868 2008-12-24 13:57 /usr/lib/libbfd.a
lrwxrwxrwx 1 root root      14 2008-12-24 14:03 /usr/lib/libbfd.so -> 
libbfd-2.19.so
-rw-r--r-- 1 root root  552376 2008-11-30 05:03 /usr/lib/libopcodes-2.19.so
-rw-r--r-- 1 root root  928604 2008-12-24 13:57 /usr/lib/libopcodes.a
lrwxrwxrwx 1 root root      18 2008-12-24 14:03 /usr/lib/libopcodes.so -> 
libopcodes-2.19.so

3) dpkg -i binutils-multiarch_2.19-1~exp2_i386.deb

Tools are diverted to the multiarch versions

4) dpkg -i binutils-multiarch-dev_2.19-1~exp2_i386.deb

Static libraries and dev library .so links point to multiarch versions

r...@jj:/tmp# ls -l /usr/lib/libbfd* /usr/lib/libopcode*
-rw-r--r-- 1 root root  2546840 2008-12-24 13:57 
/usr/lib/libbfd-2.19-multiarch.so
-rw-r--r-- 1 root root   942680 2008-11-30 05:03 /usr/lib/libbfd-2.19.so
-rw-r--r-- 1 root root 15265334 2008-12-24 13:57 /usr/lib/libbfd.a
-rw-r--r-- 1 root root  6818868 2008-12-24 13:57 /usr/lib/libbfd-single.a
lrwxrwxrwx 1 root root       14 2008-12-24 14:03 /usr/lib/libbfd-single.so -> 
libbfd-2.19.so
lrwxrwxrwx 1 root root       24 2008-12-24 14:03 /usr/lib/libbfd.so -> 
libbfd-2.19-multiarch.so
-rw-r--r-- 1 root root  1582700 2008-12-24 13:57 
/usr/lib/libopcodes-2.19-multiarch.so
-rw-r--r-- 1 root root   552376 2008-11-30 05:03 /usr/lib/libopcodes-2.19.so
-rw-r--r-- 1 root root  3601860 2008-12-24 13:57 /usr/lib/libopcodes.a
-rw-r--r-- 1 root root   928604 2008-12-24 13:57 /usr/lib/libopcodes-single.a
lrwxrwxrwx 1 root root       18 2008-12-24 14:03 /usr/lib/libopcodes-single.so 
-> libopcodes-2.19.so
lrwxrwxrwx 1 root root       28 2008-12-24 14:03 /usr/lib/libopcodes.so -> 
libopcodes-2.19-multiarch.so

5) dpkg --remove binutils-multiarch-dev

Links return to normal

r...@jj:/tmp# ls -l /usr/lib/libbfd* /usr/lib/libopcode*
-rw-r--r-- 1 root root 2546840 2008-12-24 13:57 
/usr/lib/libbfd-2.19-multiarch.so
-rw-r--r-- 1 root root  942680 2008-11-30 05:03 /usr/lib/libbfd-2.19.so
-rw-r--r-- 1 root root 6818868 2008-12-24 13:57 /usr/lib/libbfd.a
lrwxrwxrwx 1 root root      14 2008-12-24 14:03 /usr/lib/libbfd.so -> 
libbfd-2.19.so
-rw-r--r-- 1 root root 1582700 2008-12-24 13:57 
/usr/lib/libopcodes-2.19-multiarch.so
-rw-r--r-- 1 root root  552376 2008-11-30 05:03 /usr/lib/libopcodes-2.19.so
-rw-r--r-- 1 root root  928604 2008-12-24 13:57 /usr/lib/libopcodes.a
lrwxrwxrwx 1 root root      18 2008-12-24 14:03 /usr/lib/libopcodes.so -> 
libopcodes-2.19.so

It also removes some old attempts at moving the libraries, and
comments out the ld diversion which is currently disabled.

As to Peter's comment about multiarch providing binutils - it doesn't
create a universal assembler so it's not quite a complete 'provides'.

Thanks,

-i

 binutils-multiarch-dev.postrm  |   20 ++++++++++++++++++++
 binutils-multiarch-dev.preinst |   20 ++++++++++++++++++++
 binutils-multiarch.preinst     |   21 ++++++++-------------
 control                        |   13 +++++++++++++
 rules                          |   39 ++++++++++++++++++++++++++++-----------
 5 files changed, 89 insertions(+), 24 deletions(-)


-- System Information:
Debian Release: 5.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.27.9
Locale: LANG=en_AU, LC_CTYPE=en_AU (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash

Versions of packages binutils depends on:
ii  libc6                  2.7-16            GNU C Library: Shared libraries
ii  zlib1g                 1:1.2.3.3.dfsg-12 compression library - runtime

binutils recommends no packages.

Versions of packages binutils suggests:
pn  binutils-doc                  <none>     (no description available)

-- no debconf information
Index: binutils-2.19/debian/binutils-multiarch.preinst
===================================================================
--- binutils-2.19.orig/debian/binutils-multiarch.preinst	2008-12-24 22:40:43.000000000 -0800
+++ binutils-2.19/debian/binutils-multiarch.preinst	2008-12-24 22:40:55.000000000 -0800
@@ -11,19 +11,14 @@
 			--divert /usr/bin/$f.single /usr/bin/$f
 	done
 
-	for l in bfd opcodes; do
-		dpkg-divert --package binutils-multiarch \
-			--add --rename \
-			--divert /usr/lib/lib$l-single.a /usr/lib/lib$l.a
-	done
-
-	if [ -x /usr/bin/ld.single ]; then
-		rm -f /usr/bin/ld
-		dpkg-divert --package binutils-multiarch \
-			--remove --rename \
-			--divert /usr/bin/ld.single /usr/bin/ld \
-			| grep -v '^No diversion' || true
-	fi
+# multiarch ld not shipped
+#	if [ -x /usr/bin/ld.single ]; then
+#		rm -f /usr/bin/ld
+#		dpkg-divert --package binutils-multiarch \
+#			--remove --rename \
+#			--divert /usr/bin/ld.single /usr/bin/ld \
+#			| grep -v '^No diversion' || true
+#	fi
 
 fi
 
Index: binutils-2.19/debian/control
===================================================================
--- binutils-2.19.orig/debian/control	2008-12-24 22:39:50.000000000 -0800
+++ binutils-2.19/debian/control	2008-12-24 22:40:05.000000000 -0800
@@ -44,6 +44,19 @@
  NORMAL USERS SHOULD NOT INSTALL THIS PACKAGE.  It's meant only for those
  requiring support for reading info from binaries from other architectures.
 
+Package: binutils-multiarch-dev
+Architecture: any
+Priority: extra
+Depends: binutils-multiarch (= ${binary:Version}), binutils-dev (= ${binary:Version})
+Description: Binary utilities that support multi-arch targets (BFD development files)
+ The programs in this package are used to manipulate binary and object
+ files that may have been created on other architectures.  This
+ package is primarily for multi-architecture developers and
+ cross-compilers and is not needed by normal users or developers.
+ NORMAL USERS SHOULD NOT INSTALL THIS PACKAGE.  It's meant only for
+ those requiring support for reading info from binaries from other
+ architectures.
+
 Package: binutils-gold
 Architecture: amd64 i386 powerpc sparc
 Priority: extra
Index: binutils-2.19/debian/rules
===================================================================
--- binutils-2.19.orig/debian/rules	2008-12-24 22:40:12.000000000 -0800
+++ binutils-2.19/debian/rules	2008-12-24 22:40:20.000000000 -0800
@@ -18,6 +18,7 @@
 p_bin = binutils
 p_dev = $(p_bin)-dev
 p_mul = $(p_bin)-multiarch
+p_muldev = $(p_bin)-multiarch-dev
 p_gold = $(p_bin)-gold
 p_doc = $(p_bin)-doc
 p_hppa64 = $(p_bin)-hppa64
@@ -29,6 +30,7 @@
 d_bin = $(d)
 d_dev = debian/$(p_dev)
 d_mul = debian/$(p_mul)
+d_muldev = debian/$(p_muldev)
 d_gold = debian/$(p_gold)
 d_doc = debian/$(p_doc)
 d_hppa64 = debian/$(p_hppa64)
@@ -143,7 +145,7 @@
 	-rm -fr builddir-multi builddir-single builddir-hppa64 builddir-spu builddir-gold
 	-find . -name \*.gmo -o -name \*~ -o -name \*.info | xargs rm -f
 	-rm -f $(pwd)/test-summary*
-	-rm -fr $(d_bin) $(d_dev) $(d_mul) $(d_doc) $(d_hppa64) $(d_src) $(d_spu) $(d_gold)
+	-rm -fr $(d_bin) $(d_dev) $(d_mul) $(d_muldev) $(d_doc) $(d_hppa64) $(d_src) $(d_spu) $(d_gold)
 	-rm -rf debian/patched debian/tmp debian/files* debian/substvars
 	chmod 644 debian/patches/*.dpatch
 	-rm -f *-stamp
@@ -370,8 +372,8 @@
 install-stamp: checkroot build-stamp
 	$(checkdir)
 
-	rm -fr $(d_bin) $(d_dev) $(d_mul) $(d_doc) $(d_src)
-	$(install_dir) $(d_bin) $(d_dev) $(d_mul) $(d_doc) $(d_src)
+	rm -fr $(d_bin) $(d_dev) $(d_mul) $(d_muldev) $(d_doc) $(d_src)
+	$(install_dir) $(d_bin) $(d_dev) $(d_mul) $(d_muldev) $(d_doc) $(d_src)
 
 	: # install binutils and -dev stuff
 	$(MAKE) -C builddir-single \
@@ -397,6 +399,11 @@
 	: # *sigh*, bugs.debian.org/213524
 	rm -f $(d_doc)/usr/share/info/dir*
 
+	$(install_dir) $(d_dev)/usr/include/ $(d_dev)/usr/lib/
+	mv $(d_bin)/usr/include/* $(d_dev)/usr/include/
+	mv $(d_bin)/usr/lib/*.a $(d_bin)/usr/lib/libbfd.so $(d_bin)/usr/lib/libopcodes.so \
+	   $(d_dev)/usr/lib/
+
 	: # Now get rid of just about everything in binutils-multiarch
 	rm -rf $(d_mul)/usr/man $(d_mul)/usr/info $(d_mul)/usr/include
 	rm -rf $(d_mul)/usr/share/man $(d_mul)/usr/share/info $(d_mul)/usr/share/locale
@@ -410,14 +417,15 @@
 	rm -f $(d_mul)/usr/bin/embedspu
 endif
 
-	$(install_dir) $(d_dev)/usr/include/ $(d_dev)/usr/lib/
-	mv $(d_bin)/usr/include/* $(d_dev)/usr/include/
-	mv $(d_bin)/usr/lib/*.a $(d_bin)/usr/lib/libbfd.so $(d_bin)/usr/lib/libopcodes.so \
-	   $(d_dev)/usr/lib/
-
+	: # copy multiarch development files to multiarch-dev dir
+	rm -f $(d_mul)/usr/lib*/libiberty*
+	$(install_dir) $(d_muldev)/usr/lib
+	mv $(d_mul)/usr/lib/*.a $(d_mul)/usr/lib/libbfd.so $(d_mul)/usr/lib/libopcodes.so \
+	   $(d_muldev)/usr/lib
+	: # now get rid of dev files from multiarch packaging
 	rm -f $(d_mul)/usr/lib/libbfd.so $(d_mul)/usr/lib/libopcodes.so
 	rm -f $(d_mul)/usr/lib/*.la $(d_mul)/usr/lib/*.a
-	rm -f $(d_mul)/usr/lib*/libiberty*
+
 
 	: # Get rid of .la files since libtool obviously has no idea about transient paths
 	rm -f $(d_bin)/usr/lib/*.la
@@ -651,6 +659,10 @@
 	$(install_script) debian/binutils-multiarch.preinst $(d_mul)/DEBIAN/preinst
 	$(install_file) debian/binutils-multiarch.shlibs $(d_mul)/DEBIAN/shlibs
 
+	$(install_dir) $(d_muldev)/DEBIAN
+	$(install_script) debian/binutils-multiarch-dev.preinst $(d_muldev)/DEBIAN/preinst
+	$(install_script) debian/binutils-multiarch-dev.postrm $(d_muldev)/DEBIAN/postrm
+
 ifeq ($(with_gold),yes)
 	$(install_dir) $(d_gold)/DEBIAN
 	$(install_script) debian/binutils-gold.postrm $(d_gold)/DEBIAN/postrm
@@ -676,6 +688,7 @@
 	$(install_file)	debian/copyright $(d_bin)/usr/share/doc/$(p_bin)/
 
 	$(install_dir) $(d_dev)/usr/share/doc/ $(d_mul)/usr/share/doc/
+	$(install_dir) $(d_dev)/usr/share/doc/ $(d_muldev)/usr/share/doc/
 	ln -sf $(p_bin) $(d_dev)/usr/share/doc/$(p_dev)
 	ln -sf $(p_bin) $(d_mul)/usr/share/doc/$(p_mul)
 ifeq ($(with_gold),yes)
@@ -737,6 +750,9 @@
 	find $(d_mul) -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps
 	dpkg-gencontrol -isp -P$(d_mul) -p$(p_mul)
 
+	rm -f debian/substvars
+	dpkg-gencontrol -isp -P$(d_muldev) -p$(p_muldev)
+
 ifeq ($(with_gold),yes)
 	rm -f debian/substvars
 	find $(d_gold) -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps
@@ -753,11 +769,12 @@
 	dpkg-gencontrol -isp -P$(d_spu) -p$(p_spu)
 endif
 
-	chown -R root:root $(d_bin) $(d_dev) $(d_mul)
-	chmod -R go=rX  $(d_bin) $(d_dev) $(d_mul)
+	chown -R root:root $(d_bin) $(d_dev) $(d_mul) $(d_muldev)
+	chmod -R go=rX  $(d_bin) $(d_dev) $(d_mul) $(d_muldev)
 	dpkg --build $(d_bin) ..
 	dpkg --build $(d_dev) ..
 	dpkg --build $(d_mul) ..
+	dpkg --build $(d_muldev) ..
 ifeq ($(with_gold),yes)
 	chown -R root:root $(d_gold)
 	chmod -R go=rX  $(d_gold)
Index: binutils-2.19/debian/binutils-multiarch-dev.postrm
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.19/debian/binutils-multiarch-dev.postrm	2008-12-24 22:44:15.000000000 -0800
@@ -0,0 +1,20 @@
+#! /bin/sh
+
+set -e
+
+if [ "$1" = "remove" -o "$1" = "abort-install" ]; then
+
+	for l in bfd opcodes; do
+		dpkg-divert --package binutils-multiarch-dev \
+			--remove --rename \
+			--divert /usr/lib/lib$l-single.a /usr/lib/lib$l.a
+	done
+
+	# undivert .so links
+	for l in bfd opcodes; do
+	    dpkg-divert --package binutils-multiarch-dev \
+			--remove --rename \
+			--divert /usr/lib/lib$l-single.so /usr/lib/lib$l.so
+	done
+
+fi
\ No newline at end of file
Index: binutils-2.19/debian/binutils-multiarch-dev.preinst
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.19/debian/binutils-multiarch-dev.preinst	2008-12-24 22:44:15.000000000 -0800
@@ -0,0 +1,20 @@
+#! /bin/sh
+
+set -e
+
+if [ install = "$1" -o upgrade = "$1" ]; then
+
+        # divert static libraries
+	for l in bfd opcodes; do
+		dpkg-divert --package binutils-multiarch-dev \
+			--add --rename \
+			--divert /usr/lib/lib$l-single.a /usr/lib/lib$l.a
+	done
+
+	# divert .so links
+	for l in bfd opcodes; do
+	    dpkg-divert --package binutils-multiarch-dev \
+			--add --rename \
+			--divert /usr/lib/lib$l-single.so /usr/lib/lib$l.so
+	done
+fi
\ No newline at end of file

Reply via email to