* elf64-ppc.c (ppc64_elf_relocate_section): Accept a symbol on
R_PPC64_TOC relocs.
This commit is contained in:
parent
56f25033de
commit
0b13192e9f
2 changed files with 20 additions and 8 deletions
|
@ -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>
|
2003-06-17 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* section.c (struct sec): Put back kept_section.
|
* section.c (struct sec): Put back kept_section.
|
||||||
|
|
|
@ -7305,12 +7305,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
unresolved_reloc = FALSE;
|
unresolved_reloc = FALSE;
|
||||||
warned = FALSE;
|
warned = FALSE;
|
||||||
|
|
||||||
if (r_type == R_PPC64_TOC)
|
if (r_symndx < symtab_hdr->sh_info)
|
||||||
{
|
|
||||||
/* Relocation value is TOC base. */
|
|
||||||
relocation = TOCstart + htab->stub_group[input_section->id].toc_off;
|
|
||||||
}
|
|
||||||
else if (r_symndx < symtab_hdr->sh_info)
|
|
||||||
{
|
{
|
||||||
/* It's a local symbol. */
|
/* It's a local symbol. */
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
|
@ -8080,6 +8075,17 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
}
|
}
|
||||||
break;
|
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,
|
/* TOC16 relocs. We want the offset relative to the TOC base,
|
||||||
which is the address of the start of the TOC plus 0x8000.
|
which is the address of the start of the TOC plus 0x8000.
|
||||||
The TOC consists of sections .got, .toc, .tocbss, and .plt,
|
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;
|
break;
|
||||||
/* Fall thru. */
|
/* Fall thru. */
|
||||||
|
|
||||||
case R_PPC64_TOC:
|
dodyn2:
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -8247,7 +8253,8 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
memset (&outrel, 0, sizeof outrel);
|
memset (&outrel, 0, sizeof outrel);
|
||||||
else if (h != NULL
|
else if (h != NULL
|
||||||
&& !SYMBOL_REFERENCES_LOCAL (info, h)
|
&& !SYMBOL_REFERENCES_LOCAL (info, h)
|
||||||
&& !is_opd)
|
&& !is_opd
|
||||||
|
&& r_type != R_PPC64_TOC)
|
||||||
outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
|
outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue