* elf64-ppc.c (ppc64_elf_relocate_section): Accept a symbol on

R_PPC64_TOC relocs.
This commit is contained in:
Alan Modra 2003-06-18 03:26:22 +00:00
parent 56f25033de
commit 0b13192e9f
2 changed files with 20 additions and 8 deletions

View file

@ -1,3 +1,8 @@
2003-06-18 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc64_elf_relocate_section): Accept a symbol on
R_PPC64_TOC relocs.
2003-06-17 H.J. Lu <hongjiu.lu@intel.com>
* section.c (struct sec): Put back kept_section.

View file

@ -7305,12 +7305,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
unresolved_reloc = FALSE;
warned = FALSE;
if (r_type == R_PPC64_TOC)
{
/* Relocation value is TOC base. */
relocation = TOCstart + htab->stub_group[input_section->id].toc_off;
}
else if (r_symndx < symtab_hdr->sh_info)
if (r_symndx < symtab_hdr->sh_info)
{
/* It's a local symbol. */
sym = local_syms + r_symndx;
@ -8080,6 +8075,17 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
break;
case R_PPC64_TOC:
/* Relocation value is TOC base. */
relocation = TOCstart;
if (r_symndx == 0)
relocation += htab->stub_group[input_section->id].toc_off;
else if (sec != NULL && !unresolved_reloc)
relocation += htab->stub_group[sec->id].toc_off;
else
unresolved_reloc = TRUE;
goto dodyn2;
/* TOC16 relocs. We want the offset relative to the TOC base,
which is the address of the start of the TOC plus 0x8000.
The TOC consists of sections .got, .toc, .tocbss, and .plt,
@ -8186,7 +8192,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
break;
/* Fall thru. */
case R_PPC64_TOC:
dodyn2:
if ((input_section->flags & SEC_ALLOC) == 0)
break;
@ -8247,7 +8253,8 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
memset (&outrel, 0, sizeof outrel);
else if (h != NULL
&& !SYMBOL_REFERENCES_LOCAL (info, h)
&& !is_opd)
&& !is_opd
&& r_type != R_PPC64_TOC)
outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
else
{