See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html Date: Fri, 20 Aug 2004 21:13:43 -0400 From: Daniel Jacobowitz To: binutils at sources dot redhat dot com Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux Message-ID: <20040821011342.GA30319@nevyn.them.org> Mail-Followup-To: binutils at sources dot redhat dot com References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: > On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: > > Thanks. How's this? > > As you might have guessed from my rather slack review of your previous > patch, I trust you enough to give the OK without proper review. But > since you asked... :) Checked in as so. -- Daniel Jacobowitz [ rediffed against binutils-2.15.91.0.2, with some elbow grease ] 2004-08-20 Daniel Jacobowitz * elflink.c (_bfd_elf_section_already_linked): Handle SEC_LINK_DUPLICATES_SAME_CONTENTS. --- binutils-2.15.91.0.2/bfd/elflink.c.old 2004-07-27 21:36:08.000000000 -0700 +++ binutils-2.15.91.0.2/bfd/elflink.c 2004-08-26 06:38:07.000000000 -0700 @@ -9359,6 +9359,35 @@ (_("%s: %s: warning: duplicate section `%s' has different size\n"), bfd_archive_filename (abfd), name); break; + case SEC_LINK_DUPLICATES_SAME_CONTENTS: + if (sec->size != l->sec->size) + (*_bfd_error_handler) + (_("%B: duplicate section `%A' has different size\n"), + bfd_archive_filename (abfd), sec); + else if (sec->size != 0) + { + bfd_byte *sec_contents, *l_sec_contents; + + if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) + (*_bfd_error_handler) + (_("%B: warning: could not read contents of section `%A'\n"), + bfd_archive_filename (abfd), sec); + else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, + &l_sec_contents)) + (*_bfd_error_handler) + (_("%B: warning: could not read contents of section `%A'\n"), + bfd_archive_filename(l->sec->owner), l->sec); + else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) + (*_bfd_error_handler) + (_("%B: warning: duplicate section `%A' has different contents\n"), + bfd_archive_filename (abfd), sec); + + if (sec_contents) + free (sec_contents); + if (l_sec_contents) + free (l_sec_contents); + } + break; } /* Set the output_section field so that lang_add_section