This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: reloc against local symbol
On Tue, Jun 16, 2009 at 06:30:10PM +0930, Alan Modra wrote:
> x86 has two pc-relative relocations for branches, very similar to the
> first two PowerPC relocations, R_386_PLT32 and R_386_PC32. However,
> ld ignores the i386 ABI if the R_386_PLT32 symbol is local, and treats
> the relocation as if it were R_386_PC32. It is this bug (feature!)
> that allows you to do the rather questionable localization of symbols.
I guess there isn't really any need to slavishly follow the ABI for
PLTREL24 relocs against locals. This patch treats such relocs as
if they were REL24.
* elf32-ppc.c (ppc_elf_check_relocs): Allow local symbols for
R_PPC_PLTREL24 relocs.
(ppc_elf_relocate_section): Likewise.
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.257
diff -u -p -r1.257 elf32-ppc.c
--- bfd/elf32-ppc.c 19 Jun 2009 00:41:28 -0000 1.257
+++ bfd/elf32-ppc.c 19 Jun 2009 01:32:27 -0000
@@ -3570,8 +3570,11 @@ ppc_elf_check_relocs (bfd *abfd,
h->non_got_ref = TRUE;
break;
- case R_PPC_PLT32:
case R_PPC_PLTREL24:
+ if (h == NULL)
+ break;
+ /* Fall through */
+ case R_PPC_PLT32:
case R_PPC_PLTREL32:
case R_PPC_PLT16_LO:
case R_PPC_PLT16_HI:
@@ -7210,6 +7213,8 @@ ppc_elf_relocate_section (bfd *output_bf
break;
case R_PPC_PLTREL24:
+ if (h == NULL)
+ break;
/* Relocation is to the entry for this symbol in the
procedure linkage table. */
{
--
Alan Modra
Australia Development Lab, IBM