* elflink.c (bfd_elf_discard_info): Handle multiple .eh_frame

sections attached to a BFD.
	* section.c (bfd_get_section_by_name): Rewrite description.
	(bfd_get_next_section_by_name): New function.
	* bfd-in2.h: Regenerate.
This commit is contained in:
Alan Modra 2012-05-22 12:09:26 +00:00
parent 43011e5218
commit 90061c3348
4 changed files with 50 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2012-05-22 Alan Modra <amodra@gmail.com>
* elflink.c (bfd_elf_discard_info): Handle multiple .eh_frame
sections attached to a BFD.
* section.c (bfd_get_section_by_name): Rewrite description.
(bfd_get_next_section_by_name): New function.
* bfd-in2.h: Regenerate.
2012-05-21 Andreas Schwab <schwab@linux-m68k.org>
* elf32-m68k.c (elf_m68k_grok_prstatus): New function.

View File

@ -1704,6 +1704,8 @@ void bfd_section_list_clear (bfd *);
asection *bfd_get_section_by_name (bfd *abfd, const char *name);
asection *bfd_get_next_section_by_name (asection *sec);
asection *bfd_get_section_by_name_if
(bfd *abfd,
const char *name,

View File

@ -12522,8 +12522,8 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
fini_reloc_cookie_rels (&cookie, stab);
}
if (eh != NULL
&& init_reloc_cookie_rels (&cookie, info, abfd, eh))
while (eh != NULL
&& init_reloc_cookie_rels (&cookie, info, abfd, eh))
{
_bfd_elf_parse_eh_frame (abfd, info, eh, &cookie);
if (_bfd_elf_discard_section_eh_frame (abfd, info, eh,
@ -12531,6 +12531,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
&cookie))
ret = TRUE;
fini_reloc_cookie_rels (&cookie, eh);
eh = bfd_get_next_section_by_name (eh);
}
if (bed->elf_backend_discard_info != NULL

View File

@ -845,14 +845,8 @@ SYNOPSIS
asection *bfd_get_section_by_name (bfd *abfd, const char *name);
DESCRIPTION
Run through @var{abfd} and return the one of the
<<asection>>s whose name matches @var{name}, otherwise <<NULL>>.
@xref{Sections}, for more information.
This should only be used in special cases; the normal way to process
all sections of a given name is to use <<bfd_map_over_sections>> and
<<strcmp>> on the name (or better yet, base it on the section flags
or something else) for each section.
Return the most recently created section attached to @var{abfd}
named @var{name}. Return NULL if no such section exists.
*/
asection *
@ -867,6 +861,41 @@ bfd_get_section_by_name (bfd *abfd, const char *name)
return NULL;
}
/*
FUNCTION
bfd_get_next_section_by_name
SYNOPSIS
asection *bfd_get_next_section_by_name (asection *sec);
DESCRIPTION
Given @var{sec} is a section returned by @code{bfd_get_section_by_name},
return the next most recently created section attached to the same
BFD with the same name. Return NULL if no such section exists.
*/
asection *
bfd_get_next_section_by_name (asection *sec)
{
struct section_hash_entry *sh;
const char *name;
unsigned long hash;
sh = ((struct section_hash_entry *)
((char *) sec - offsetof (struct section_hash_entry, section)));
hash = sh->root.hash;
name = sec->name;
for (sh = (struct section_hash_entry *) sh->root.next;
sh != NULL;
sh = (struct section_hash_entry *) sh->root.next)
if (sh->root.hash == hash
&& strcmp (sh->root.string, name) == 0)
return &sh->section;
return NULL;
}
/*
FUNCTION
bfd_get_section_by_name_if