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;

Reply via email to