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.
This commit is contained in:
Nick Clifton 2013-02-14 11:52:25 +00:00
parent 1773c82c92
commit d99b05a32e
2 changed files with 64 additions and 45 deletions

View File

@ -1,3 +1,10 @@
2013-02-14 Nick Clifton <nickc@redhat.com>
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 <nickc@redhat.com>
* elfcomm.c (get_archive_member_name): Prevent seg-fault if a

View File

@ -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;
gnu_debuglink_section = bfd_create_gnu_debuglink_section
(obfd, gnu_debuglink_filename);
/* 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.
if (gnu_debuglink_section == NULL)
{
bfd_nonfatal_message (NULL, obfd, NULL,
_("cannot create debug link section `%s'"),
gnu_debuglink_filename);
return FALSE;
}
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;
/* 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;
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;
/* 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.
bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_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);
}
}
}