* elflink.c (elf_link_input_bfd): Try harder to support
	relocations against symbols in removed linkonce sections.
This commit is contained in:
Alan Modra 2004-10-11 13:29:01 +00:00
parent a271cc337c
commit 87e5235d04
2 changed files with 35 additions and 37 deletions

View File

@ -1,3 +1,9 @@
2004-10-11 Alan Modra <amodra@bigpond.net.au>
PR 233
* elflink.c (elf_link_input_bfd): Try harder to support
relocations against symbols in removed linkonce sections.
2004-10-11 Alan Modra <amodra@bigpond.net.au>
* elflink.c (elf_link_input_bfd): Revert PR 354 change.

View File

@ -6733,44 +6733,10 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
discarded section. */
if ((sec = *ps) != NULL && elf_discarded_section (sec))
{
if ((o->flags & SEC_DEBUGGING) != 0)
{
BFD_ASSERT (r_symndx != 0);
asection *kept;
/* Try to preserve debug information.
FIXME: This is quite broken. Modifying
the symbol here means we will be changing
all uses of the symbol, not just those in
debug sections. The only thing that makes
this half reasonable is that debug sections
tend to come after other sections. Of
course, that doesn't help with globals.
??? All link-once sections of the same name
ought to define the same set of symbols, so
it would seem that globals ought to always
be defined in the kept section. */
if (sec->kept_section != NULL)
{
asection *member;
/* Check if it is a linkonce section or
member of a comdat group. */
if (elf_sec_group (sec) == NULL
&& sec->size == sec->kept_section->size)
{
*ps = sec->kept_section;
continue;
}
else if (elf_sec_group (sec) != NULL
&& (member = match_group_member (sec, sec->kept_section))
&& sec->size == member->size)
{
*ps = member;
continue;
}
}
}
else if (complain)
BFD_ASSERT (r_symndx != 0);
if (complain && (o->flags & SEC_DEBUGGING) == 0)
{
(*_bfd_error_handler)
(_("`%s' referenced in section `%A' of %B: "
@ -6778,6 +6744,32 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
o, input_bfd, sec, sec->owner, sym_name);
}
/* Try to do the best we can to support buggy old
versions of gcc. If we've warned, or this is
debugging info, pretend that the symbol is
really defined in the kept linkonce section.
FIXME: This is quite broken. Modifying the
symbol here means we will be changing all later
uses of the symbol, not just in this section.
The only thing that makes this half reasonable
is that we warn in non-debug sections, and
debug sections tend to come after other
sections. */
kept = sec->kept_section;
if (kept != NULL
&& (complain
|| (o->flags & SEC_DEBUGGING) != 0))
{
if (elf_sec_group (sec) != NULL)
kept = match_group_member (sec, kept);
if (kept != NULL
&& sec->size == kept->size)
{
*ps = kept;
continue;
}
}
/* Remove the symbol reference from the reloc, but
don't kill the reloc completely. This is so that
a zero value will be written into the section,