From d99b05a32ecaecbaaac6c07f9cbcd8ba46746951 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 14 Feb 2013 11:52:25 +0000 Subject: [PATCH] PR binutils/15125 * objcopy.c (copy_object): Provide a helpful warning message when adding a gnu_debuglink section to an object which already contains one. --- binutils/ChangeLog | 7 +++ binutils/objcopy.c | 108 +++++++++++++++++++++++++-------------------- 2 files changed, 67 insertions(+), 48 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 754ebb88372..e9d030eced6 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2013-02-14 Nick Clifton + + PR binutils/15125 + * objcopy.c (copy_object): Provide a helpful warning message when + adding a gnu_debuglink section to an object which already contains + one. + 2013-02-07 Nick Clifton * elfcomm.c (get_archive_member_name): Prevent seg-fault if a diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 1200eb6270d..ca372889bea 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1763,58 +1763,70 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) if (gnu_debuglink_filename != NULL) { - gnu_debuglink_section = bfd_create_gnu_debuglink_section - (obfd, gnu_debuglink_filename); - - if (gnu_debuglink_section == NULL) + /* PR 15125: Give a helpful warning message if + the debuglink section already exists, and + allow the rest of the copy to complete. */ + if (bfd_get_section_by_name (obfd, ".gnu_debuglink")) { - bfd_nonfatal_message (NULL, obfd, NULL, - _("cannot create debug link section `%s'"), - gnu_debuglink_filename); - return FALSE; + non_fatal (_("%s: debuglink section already exists"), + bfd_get_filename (obfd)); + gnu_debuglink_filename = NULL; } - - /* Special processing for PE format files. We - have no way to distinguish PE from COFF here. */ - if (bfd_get_flavour (obfd) == bfd_target_coff_flavour) + else { - bfd_vma debuglink_vma; - asection * highest_section; - asection * sec; - - /* The PE spec requires that all sections be adjacent and sorted - in ascending order of VMA. It also specifies that debug - sections should be last. This is despite the fact that debug - sections are not loaded into memory and so in theory have no - use for a VMA. - - This means that the debuglink section must be given a non-zero - VMA which makes it contiguous with other debug sections. So - walk the current section list, find the section with the - highest VMA and start the debuglink section after that one. */ - for (sec = obfd->sections, highest_section = NULL; - sec != NULL; - sec = sec->next) - if (sec->vma > 0 - && (highest_section == NULL - || sec->vma > highest_section->vma)) - highest_section = sec; - - if (highest_section) - debuglink_vma = BFD_ALIGN (highest_section->vma - + highest_section->size, - /* FIXME: We ought to be using - COFF_PAGE_SIZE here or maybe - bfd_get_section_alignment() (if it - was set) but since this is for PE - and we know the required alignment - it is easier just to hard code it. */ - 0x1000); - else - /* Umm, not sure what to do in this case. */ - debuglink_vma = 0x1000; + gnu_debuglink_section = bfd_create_gnu_debuglink_section + (obfd, gnu_debuglink_filename); + + if (gnu_debuglink_section == NULL) + { + bfd_nonfatal_message (NULL, obfd, NULL, + _("cannot create debug link section `%s'"), + gnu_debuglink_filename); + return FALSE; + } - bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma); + /* Special processing for PE format files. We + have no way to distinguish PE from COFF here. */ + if (bfd_get_flavour (obfd) == bfd_target_coff_flavour) + { + bfd_vma debuglink_vma; + asection * highest_section; + asection * sec; + + /* The PE spec requires that all sections be adjacent and sorted + in ascending order of VMA. It also specifies that debug + sections should be last. This is despite the fact that debug + sections are not loaded into memory and so in theory have no + use for a VMA. + + This means that the debuglink section must be given a non-zero + VMA which makes it contiguous with other debug sections. So + walk the current section list, find the section with the + highest VMA and start the debuglink section after that one. */ + for (sec = obfd->sections, highest_section = NULL; + sec != NULL; + sec = sec->next) + if (sec->vma > 0 + && (highest_section == NULL + || sec->vma > highest_section->vma)) + highest_section = sec; + + if (highest_section) + debuglink_vma = BFD_ALIGN (highest_section->vma + + highest_section->size, + /* FIXME: We ought to be using + COFF_PAGE_SIZE here or maybe + bfd_get_section_alignment() (if it + was set) but since this is for PE + and we know the required alignment + it is easier just to hard code it. */ + 0x1000); + else + /* Umm, not sure what to do in this case. */ + debuglink_vma = 0x1000; + + bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma); + } } } -- 2.30.2