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

Bug#771497: file conflict between converted and unconverted libc6 package



Source: dpkg-cross
Version: 2.6.11
Severity: important
Tags: patch
User: helmutg@debian.org
Usertags: rebootstrap

When converting libc6:x32 using dpkg-cross, the symlink to the linker
does not get translated. In libc6:x32 it looks like:

lrwxrwxrwx root/root         0 2014-11-30 00:08 ./libx32/ld-linux-x32.so.2 -> /lib/x86_64-linux-gnux32/ld-2.19.so

In libc6-x32-cross:all it looks like:

lrwxrwxrwx root/root         0 2014-11-30 00:10 ./libx32/ld-linux-x32.so.2 -> ../usr/x86_64-linux-gnux32/lib/ld-2.19.so

When installing both libc6:x32 and libc6-x32-cross:all, an undeclared
file conflict occurs.

Note that x32 is only an example here. The same issue happens for arm's
libsf and libhf as well as mips' libn32.

This causes bootstrapping of new architectures to fail. This is also why
I marked this bug with severity important.

The attached patch simply applies the existing logic for lib32 and lib64
to libhf, libn32, libsf and libx32 as well and thereby solves the issue
at hand.

Helmut
diff -Nru dpkg-cross-2.6.11/Debian/DpkgCross.pm dpkg-cross-2.6.11+nmu1/Debian/DpkgCross.pm
--- dpkg-cross-2.6.11/Debian/DpkgCross.pm	2011-03-25 22:17:47.000000000 +0100
+++ dpkg-cross-2.6.11+nmu1/Debian/DpkgCross.pm	2014-11-30 08:46:18.000000000 +0100
@@ -16,7 +16,8 @@
 $progname %archtable %std_tools
 %pkgvars %allcrossroots $arch $default_arch $deb_host_gnu_type
 $crossbase $crossprefix $crossdir $crossbin $crosslib $crossroot
-$crossinc $crosslib64 $crosslib32 $package $mode $tool_ %config
+$crossinc $crosslib64 $crosslib32 $crosslibhf $crosslibn32
+$crosslibsf $crosslibx32 $package $mode $tool_ %config
 @keepdeps %allcrossroots @removedeps $maintainer $arch_dir
 $compilerpath %debug_data);
 @ISA       = qw(Exporter);
@@ -171,6 +172,10 @@
 	$crosslib = $conf->{'crosslib'};
 	$crosslib64 = $conf->{'crosslib64'};
 	$crosslib32 = $conf->{'crosslib32'};
+	$crosslibhf = $conf->{'crosslibhf'};
+	$crosslibn32 = $conf->{'crosslibn32'};
+	$crosslibsf = $conf->{'crosslibsf'};
+	$crosslibx32 = $conf->{'crosslibx32'};
 	$crossinc = $conf->{'crossinc'};
 	$maintainer = $conf->{'maintainer'};
 	$compilerpath = $conf->{'compilerpath'};
@@ -204,6 +209,10 @@
 		$crosslib ||= $conf->{'crosslib'};
 		$crosslib64 ||= $conf->{'crosslib64'};
 		$crosslib32 ||= $conf->{'crosslib32'};
+		$crosslibhf ||= $conf->{'crosslibhf'};
+		$crosslibn32 ||= $conf->{'crosslibn32'};
+		$crosslibsf ||= $conf->{'crosslibsf'};
+		$crosslibx32 ||= $conf->{'crosslibx32'};
 		$crossinc ||= $conf->{'crossinc'};
 		$maintainer ||= $conf->{'maintainer'};
 		$compilerpath ||= $conf->{'compilerpath'};
@@ -383,6 +392,10 @@
 
 	$crosslib64 ||= $crosslib . "64";
 	$crosslib32 ||= $crosslib . "32";
+	$crosslibhf ||= $crosslib . "hf";
+	$crosslibn32 ||= $crosslib . "n32";
+	$crosslibsf ||= $crosslib . "sf";
+	$crosslibx32 ||= $crosslib . "x32";
 	$config{'crossbase'} = $crossbase;
 	$config{'crossprefix'} = $crossprefix;
 	$config{'crossdir'} = $crossdir;
@@ -390,6 +403,10 @@
 	$config{'crosslib'} = $crosslib;
 	$config{'crosslib64'} = $crosslib64;
 	$config{'crosslib32'} = $crosslib32;
+	$config{'crosslibhf'} = $crosslibhf;
+	$config{'crosslibn32'} = $crosslibn32;
+	$config{'crosslibsf'} = $crosslibsf;
+	$config{'crosslibx32'} = $crosslibx32;
 	$config{'crossinc'} = $crossinc;
 	$config{'crossroot'} = $crossroot;
 
@@ -410,6 +427,10 @@
 	$crosslib = $config{'crosslib'};
 	$crosslib64 = $config{'crosslib64'};
 	$crosslib32 = $config{'crosslib32'};
+	$crosslibhf = $config{'crosslibhf'};
+	$crosslibn32 = $config{'crosslibn32'};
+	$crosslibsf = $config{'crosslibsf'};
+	$crosslibx32 = $config{'crosslibx32'};
 	$crossinc = $config{'crossinc'};
 }
 
@@ -463,6 +484,14 @@
 		$path = "$crosslib32/$'";
 	} elsif ($path =~ m:^(/emul/ia32-linux/(usr/)?lib/($multiarch)?):) {
 		$path = "$crosslib32/$'";
+	} elsif ($path =~ /^(\/usr)?\/libhf\/($multiarch)?/) {
+		$path = "$crosslibhf/$'";
+	} elsif ($path =~ /^(\/usr)?\/libn32\/($multiarch)?/) {
+		$path = "$crosslibn32/$'";
+	} elsif ($path =~ /^(\/usr)?\/libsf\/($multiarch)?/) {
+		$path = "$crosslibsf/$'";
+	} elsif ($path =~ /^(\/usr)?\/libx32\/($multiarch)?/) {
+		$path = "$crosslibx32/$'";
 	} elsif ($path =~ /^\/usr\/\w+-\w+(-\w+(-\w+)?)?\//) {
 		# leave alone
 	} else {
diff -Nru dpkg-cross-2.6.11/debian/changelog dpkg-cross-2.6.11+nmu1/debian/changelog
--- dpkg-cross-2.6.11/debian/changelog	2013-05-24 21:28:56.000000000 +0200
+++ dpkg-cross-2.6.11+nmu1/debian/changelog	2014-11-30 08:49:56.000000000 +0100
@@ -1,3 +1,10 @@
+dpkg-cross (2.6.11+nmu1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Support lib{hf,n32,sf,x32}. (Closes: #-1)
+
+ -- Helmut Grohne <helmut@subdivi.de>  Sun, 30 Nov 2014 08:49:39 +0100
+
 dpkg-cross (2.6.11) unstable; urgency=low
 
   * Upload changes from experimental to unstable.
diff -Nru dpkg-cross-2.6.11/dpkg-cross dpkg-cross-2.6.11+nmu1/dpkg-cross
--- dpkg-cross-2.6.11/dpkg-cross	2013-05-24 21:28:22.000000000 +0200
+++ dpkg-cross-2.6.11+nmu1/dpkg-cross	2014-11-30 08:53:56.000000000 +0100
@@ -12,7 +12,8 @@
 use warnings;
 use vars qw($verbose $str @removedeps $package %builds $arch $exclude
 @keepdeps $dpkg_statfile $progname $debname $anyway $cross2cross $crosstype
-$crossdir $crosslib $crosslib64 $crosslib32 $crossinc $data $len
+$crossdir $crosslib $crosslib64 $crosslib32 $crosslibhf $crosslibn32
+$crosslibsf $crosslibx32 $crossinc $data $len
 $retval $dpkg_cmd $mode $pkg @exlist $conffile $removedeps $keepdeps
 $DPKGCROSSVERSION $keep_temp $msg $multiarchpackage $multiarch $multiarchconv);
 
@@ -728,6 +729,10 @@
 	$crosslib = $$config{'crosslib'};
 	$crosslib64 = $$config{'crosslib64'};
 	$crosslib32 = $$config{'crosslib32'};
+	$crosslibhf = $$config{'crosslibhf'};
+	$crosslibn32 = $$config{'crosslibn32'};
+	$crosslibsf = $$config{'crosslibsf'};
+	$crosslibx32 = $$config{'crosslibx32'};
 	# add extra regexp component for multiarch packages
 	if ($multiarchpackage) { $multiarch="\Q$crosstype/\E" } else {$multiarch=""};
 
@@ -796,6 +801,18 @@
 		} elsif ((m:^/emul/ia32-linux/usr/lib/([^/]+\.[ao])$:)) {
 			# regular .a or .o file under /emul/ia32-linux/ for #463588
 			link_file("$src$_", "$dst$crosslib32/$1") or goto fail;
+		} elsif (m:^/usr/libhf/([^/]+\.[ao])$:) {
+			# regular .a or .o file under /usr/libhf
+			link_file("$src$_", "$dst$crosslibhf/$1") or goto fail;
+		} elsif (m:^/usr/libn32/([^/]+\.[ao])$:) {
+			# regular .a or .o file under /usr/libn32
+			link_file("$src$_", "$dst$crosslibn32/$1") or goto fail;
+		} elsif (m:^/usr/libsf/([^/]+\.[ao])$:) {
+			# regular .a or .o file under /usr/libsf
+			link_file("$src$_", "$dst$crosslibsf/$1") or goto fail;
+		} elsif (m:^/usr/libx32/([^/]+\.[ao])$:) {
+			# regular .a or .o file under /usr/libx32
+			link_file("$src$_", "$dst$crosslibx32/$1") or goto fail;
 		} elsif (m:^(/usr)?/lib/($multiarch)?([^/]+\.so[^/]*)$:) {
 			# regular .so* file under /lib, /usr/lib, /lib/<triplet>, /usr/lib/<triplet>
 			if (is_ldscript("$src$_")) {
@@ -831,6 +848,34 @@
 			} else {
 				link_file("$src$_", "$dst$crosslib32/$1") or goto fail;
 			}
+		} elsif (m:^(/usr)?/libhf/([^/]+\.so[^/]*)$:) {
+			# regular .so* file under /libhf, /usr/libhf
+			if (is_ldscript("$src$_")) {
+				fix_ldscript("$src$_", "$dst$crosslibhf/$2") or goto fail;
+			} else {
+				link_file("$src$_", "$dst$crosslibhf/$2") or goto fail;
+			}
+		} elsif (m:^(/usr)?/libn32/([^/]+\.so[^/]*)$:) {
+			# regular .so* file under /libn32, /usr/libn32
+			if (is_ldscript("$src$_")) {
+				fix_ldscript("$src$_", "$dst$crosslibn32/$2") or goto fail;
+			} else {
+				link_file("$src$_", "$dst$crosslibn32/$2") or goto fail;
+			}
+		} elsif (m:^(/usr)?/libsf/([^/]+\.so[^/]*)$:) {
+			# regular .so* file under /libsf, /usr/libsf
+			if (is_ldscript("$src$_")) {
+				fix_ldscript("$src$_", "$dst$crosslibsf/$2") or goto fail;
+			} else {
+				link_file("$src$_", "$dst$crosslibsf/$2") or goto fail;
+			}
+		} elsif (m:^(/usr)?/libx32/([^/]+\.so[^/]*)$:) {
+			# regular .so* file under /libx32, /usr/libx32
+			if (is_ldscript("$src$_")) {
+				fix_ldscript("$src$_", "$dst$crosslibx32/$2") or goto fail;
+			} else {
+				link_file("$src$_", "$dst$crosslibx32/$2") or goto fail;
+			}
 		} elsif (m:^/usr/lib/$multiarch([^/]+\.la)$:) {
 			# regular .la file under /usr/lib
 			fix_la_file("$src$_", "$dst$crosslib/$1", $crosslib) or goto fail;

Reply to: