Source: dpkg-cross Version: 2.6.11 Severity: important Tags: patch User: helm...@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 <hel...@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;