From b4a38de6b6a4ee5fe0564e3c14a15c706ad2338b Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 12 Jan 2005 11:28:28 +0000 Subject: include/elf/ * ppc.h (R_PPC_RELAX32_PLT, R_PPC_RELAX32PC_PLT): Define. (R_PPC_RELAX32, R_PPC_RELAX32PC): Adjust value. bfd/ * elf32-ppc.c (ppc_elf_howto_raw): Delete RELAX32* entries. (ppc_elf_relax_section): Use PLT variants of RELAX32 relocs for reaching PLT. (ppc_elf_relocate_section): Handle R_PPC_RELAX32_PLT and R_PPC_RELAX32PC_PLT. --- bfd/ChangeLog | 8 ++++++++ bfd/elf32-ppc.c | 50 +++++++++++++++++++++----------------------------- 2 files changed, 29 insertions(+), 29 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2c4b88a..ae281de 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2005-01-12 Alan Modra + + * elf32-ppc.c (ppc_elf_howto_raw): Delete RELAX32* entries. + (ppc_elf_relax_section): Use PLT variants of RELAX32 relocs for + reaching PLT. + (ppc_elf_relocate_section): Handle R_PPC_RELAX32_PLT and + R_PPC_RELAX32PC_PLT. + 2005-01-11 Alan Modra * elf64-ppc.c (ppc64_elf_gc_sweep_hook): Follow indirect and warning diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 86fb760..cafbae0 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1533,35 +1533,6 @@ static reloc_howto_type ppc_elf_howto_raw[] = { 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - /* Phony relocs to handle branch stubs. */ - HOWTO (R_PPC_RELAX32, /* type */ - 0, /* rightshift */ - 0, /* size */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_RELAX32", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_PPC_RELAX32PC, /* type */ - 0, /* rightshift */ - 0, /* size */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_RELAX32PC", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - /* GNU extension to record C++ vtable hierarchy. */ HOWTO (R_PPC_GNU_VTINHERIT, /* type */ 0, /* rightshift */ @@ -1867,6 +1838,12 @@ ppc_elf_relax_section (bfd *abfd, stub_rtype = R_PPC_RELAX32; } + if (R_PPC_RELAX32_PLT - R_PPC_RELAX32 + != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC) + abort (); + if (tsec == ppc_info->plt) + stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32; + /* Hijack the old relocation. Since we need two relocations for this use a "composite" reloc. */ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), @@ -5422,12 +5399,27 @@ ppc_elf_relocate_section (bfd *output_bfd, } break; + case R_PPC_RELAX32PC_PLT: + case R_PPC_RELAX32_PLT: + BFD_ASSERT (h != NULL + && h->plt.offset != (bfd_vma) -1 + && htab->plt != NULL); + + relocation = (htab->plt->output_section->vma + + htab->plt->output_offset + + h->plt.offset); + if (r_type == R_PPC_RELAX32_PLT) + goto relax32; + /* Fall thru */ + case R_PPC_RELAX32PC: relocation -= (input_section->output_section->vma + input_section->output_offset + rel->r_offset - 4); /* Fall thru */ + case R_PPC_RELAX32: + relax32: { unsigned long t0; unsigned long t1; -- cgit v1.1