This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[PATCH] PPC and prelink
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Alan Modra <amodra at bigpond dot net dot au>
- Cc: "H. J. Lu" <hjl at lucon dot org>, Jack Howarth <howarth at nitro dot med dot uc dot edu>, binutils at sources dot redhat dot com
- Date: Tue, 17 Sep 2002 15:25:28 +0200
- Subject: [PATCH] PPC and prelink
- References: <200209161735.NAA76350@nitro.msbb.uc.edu> <20020916110610.A4928@lucon.org> <20020916145744.F12870@devserv.devel.redhat.com> <20020917081707.I14457@bubble.sa.bigpond.net.au> <20020917023531.J12870@devserv.devel.redhat.com> <20020917163119.V14457@bubble.sa.bigpond.net.au>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
On Tue, Sep 17, 2002 at 04:31:19PM +0930, Alan Modra wrote:
> On Tue, Sep 17, 2002 at 02:35:31AM -0400, Jakub Jelinek wrote:
> > But I'd need to know what should be the PPC canonical *r_offset value...
>
> Zero. powerpc is RELA, so the section contents don't matter. I don't
> think it makes any sense to both apply and emit relocs.
This patch should do the job, at least in my limited testing so far.
It would be good to test non-pic .so if that is supported on ppc
at all though to see if the insn fields are cleared.
2002-09-17 Jakub Jelinek <jakub@redhat.com>
* elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Clear .got word
even if generating R_PPC_RELATIVE reloc.
(ppc_elf_relocate_section): Make sure relocation is performed if
skip == -2. Clear memory at r_offset when creating dynamic
relocation.
--- bfd/elf32-ppc.c.jj 2002-09-10 14:50:43.000000000 +0200
+++ bfd/elf32-ppc.c 2002-09-17 15:10:49.000000000 +0200
@@ -2743,11 +2743,11 @@ ppc_elf_finish_dynamic_symbol (output_bf
else
{
BFD_ASSERT ((h->got.offset & 1) == 0);
- bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_GLOB_DAT);
rela.r_addend = 0;
}
+ bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
bfd_elf32_swap_reloca_out (output_bfd, &rela,
((Elf32_External_Rela *) srela->contents
+ srela->reloc_count));
@@ -3287,13 +3287,19 @@ ppc_elf_relocate_section (output_bfd, in
+ sreloc->reloc_count));
++sreloc->reloc_count;
- /* This reloc will be computed at runtime, so there's no
- need to do anything now, unless this is a RELATIVE
- reloc in an unallocated section. */
- if (skip != -1
- || (input_section->flags & SEC_ALLOC) != 0
- || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE)
+ if (skip == -1)
continue;
+
+ /* This reloc will be computed at runtime. We clear the memory
+ so that it contains predictable value. */
+ if (! skip
+ && ((input_section->flags & SEC_ALLOC) != 0
+ || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
+ {
+ relocation = howto->pc_relative ? outrel.r_offset : 0;
+ addend = 0;
+ break;
+ }
}
/* Arithmetic adjust relocations that aren't going into a
@@ -3390,7 +3396,6 @@ ppc_elf_relocate_section (output_bfd, in
off &= ~1;
else
{
- bfd_put_32 (output_bfd, relocation, sgot->contents + off);
if (info->shared)
{
@@ -3412,8 +3417,10 @@ ppc_elf_relocate_section (output_bfd, in
srelgot->contents)
+ srelgot->reloc_count));
++srelgot->reloc_count;
+ relocation = 0;
}
+ bfd_put_32 (output_bfd, relocation, sgot->contents + off);
local_got_offsets[r_symndx] |= 1;
}
Jakub