Date: Wednesday, May 11, 2011 @ 06:41:25
  Author: allan
Revision: 123424

upgpkg: binutils 2.21-8
fix segfault when stripping non-native files

Added:
  binutils/trunk/binutils-2.21-strip-segfault.patch
Modified:
  binutils/trunk/PKGBUILD

------------------------------------+
 PKGBUILD                           |   12 +++-
 binutils-2.21-strip-segfault.patch |   96 +++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2011-05-11 10:13:48 UTC (rev 123423)
+++ PKGBUILD    2011-05-11 10:41:25 UTC (rev 123424)
@@ -5,7 +5,7 @@
 
 pkgname=binutils
 pkgver=2.21
-pkgrel=7
+pkgrel=8
 _date=20110430
 pkgdesc="A set of programs to assemble and manipulate binary and object files"
 arch=('i686' 'x86_64')
@@ -16,8 +16,10 @@
 makedepends=('dejagnu')
 options=('!libtool' '!distcc' '!ccache')
 install=binutils.install
-source=(ftp://ftp.archlinux.org/other/${pkgname}/${pkgname}-${pkgver}_${_date}.tar.bz2)
-md5sums=('7b3e28fb35cb8bb371cc47291e1c6dec')
+source=(ftp://ftp.archlinux.org/other/${pkgname}/${pkgname}-${pkgver}_${_date}.tar.bz2
+        binutils-2.21-strip-segfault.patch)
+md5sums=('7b3e28fb35cb8bb371cc47291e1c6dec'
+         '98e8dfaf1c0ededa586823ebfb27825a')
 
 mksource() {
   mkdir ${pkgname}-${_date}
@@ -30,6 +32,10 @@
 }
 
 build() {
+  cd ${srcdir}/binutils
+  # http://sourceware.org/bugzilla/show_bug.cgi?id=12632 
+  patch -Np1 -i $srcdir/binutils-2.21-strip-segfault.patch
+
   cd ${srcdir}
   mkdir binutils-build && cd binutils-build
 

Added: binutils-2.21-strip-segfault.patch
===================================================================
--- binutils-2.21-strip-segfault.patch                          (rev 0)
+++ binutils-2.21-strip-segfault.patch  2011-05-11 10:41:25 UTC (rev 123424)
@@ -0,0 +1,96 @@
+diff --git a/binutils/objcopy.c b/binutils/objcopy.c
+index 15c4f95..b64f3d0 100644
+--- a/binutils/objcopy.c
++++ b/binutils/objcopy.c
+@@ -1,6 +1,6 @@
+ /* objcopy.c -- copy object file from input to output, optionally massaging 
it.
+    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
++   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+    Free Software Foundation, Inc.
+ 
+    This file is part of GNU Binutils.
+@@ -2024,6 +2024,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char 
*output_target,
+       struct stat buf;
+       int stat_status = 0;
+       bfd_boolean del = TRUE;
++      bfd_boolean ok_object;
+ 
+       /* Create an output file for this member.  */
+       output_name = concat (dir, "/",
+@@ -2061,44 +2062,42 @@ copy_archive (bfd *ibfd, bfd *obfd, const char 
*output_target,
+       l->obfd = NULL;
+       list = l;
+ 
+-      if (bfd_check_format (this_element, bfd_object))
++      ok_object = bfd_check_format (this_element, bfd_object);
++      if (!ok_object)
++      bfd_nonfatal_message (NULL, this_element, NULL,
++                            _("Unable to recognise the format of file"));
++
++      /* PR binutils/3110: Cope with archives
++       containing multiple target types.  */
++      if (force_output_target || !ok_object)
++      output_bfd = bfd_openw (output_name, output_target);
++      else
++      output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
++
++      if (output_bfd == NULL)
+       {
+-        /* PR binutils/3110: Cope with archives
+-           containing multiple target types.  */
+-        if (force_output_target)
+-          output_bfd = bfd_openw (output_name, output_target);
+-        else
+-          output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
++        bfd_nonfatal_message (output_name, NULL, NULL, NULL);
++        status = 1;
++        return;
++      }
++
++      if (ok_object)
++      {
++        del = !copy_object (this_element, output_bfd, input_arch);
+ 
+-        if (output_bfd == NULL)
++        if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
++          /* Try again as an unknown object file.  */
++          ok_object = FALSE;
++        else if (!bfd_close (output_bfd))
+           {
+             bfd_nonfatal_message (output_name, NULL, NULL, NULL);
++            /* Error in new object file. Don't change archive.  */
+             status = 1;
+-            return;
+           }
+-
+-        del = ! copy_object (this_element, output_bfd, input_arch);
+-
+-        if (! del
+-            || bfd_get_arch (this_element) != bfd_arch_unknown)
+-          {
+-            if (!bfd_close (output_bfd))
+-              {
+-                bfd_nonfatal_message (output_name, NULL, NULL, NULL);
+-                /* Error in new object file. Don't change archive.  */
+-                status = 1;
+-              }
+-          }
+-        else
+-          goto copy_unknown_element;
+       }
+-      else
+-      {
+-        bfd_nonfatal_message (NULL, this_element, NULL,
+-                              _("Unable to recognise the format of file"));
+ 
+-        output_bfd = bfd_openw (output_name, output_target);
+-copy_unknown_element:
++      if (!ok_object)
++      {
+         del = !copy_unknown_object (this_element, output_bfd);
+         if (!bfd_close_all_done (output_bfd))
+           {
+-- 
+1.6.5.GIT
+

Reply via email to