This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[arm] Resolve R_ARM_PREL31
- From: Paul Brook <paul at codesourcery dot com>
- To: binutils at sources dot redhat dot com
- Cc: Richard Earnshaw <rearnsha at arm dot com>
- Date: Fri, 12 Nov 2004 09:41:07 +0000
- Subject: [arm] Resolve R_ARM_PREL31
- Organization: CodeSourcery
The R_ARM_PREL31 relocation should be resolved to the PTL entry for external
symbols, and not written into shared objects. Patch below implements this.
Tested with cross to arm-none-eabi, and light testing on arm-none-symbianelf.
Ok?
2004-11-11 Paul Brook <paul@codesourcery.com>
* bfd/elf32-arm.c (elf32_arm_final_link_relocate): Resolve
R_ARM_PREL31 relocations to PLT entries.
(elf32_arm_relocate_section, elf32_arm_gc_sweep_hook): Ditto.
(elf32_arm_check_relocs): Ditto.
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.5
diff -u -p -r1.5 elf32-arm.c
--- bfd/elf32-arm.c 9 Nov 2004 16:50:38 -0000 1.5
+++ bfd/elf32-arm.c 12 Nov 2004 01:49:40 -0000
@@ -2288,11 +2288,7 @@ elf32_arm_final_link_relocate (reloc_how
will use the symbol's value, which may point to a PLT entry, but we
don't need to handle that here. If we created a PLT entry, all
branches in this object should go to it. */
- if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
-#ifndef OLD_ARM_ABI
- && r_type != R_ARM_PREL31
-#endif
- )
+ if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
&& h != NULL
&& splt != NULL
&& h->plt.offset != (bfd_vma) -1)
@@ -2314,11 +2310,8 @@ elf32_arm_final_link_relocate (reloc_how
into the output file to be resolved at run time. */
if (info->shared
&& (input_section->flags & SEC_ALLOC)
- && ((r_type != R_ARM_REL32
-#ifndef OLD_ARM_ABI
- && r_type != R_ARM_PREL31
-#endif
- ) || !SYMBOL_CALLS_LOCAL (info, h))
+ && (r_type != R_ARM_REL32
+ || !SYMBOL_CALLS_LOCAL (info, h))
&& (h == NULL
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|| h->root.type != bfd_link_hash_undefweak)
@@ -2326,6 +2319,7 @@ elf32_arm_final_link_relocate (reloc_how
#ifndef OLD_ARM_ABI
&& r_type != R_ARM_CALL
&& r_type != R_ARM_JUMP24
+ && r_type != R_ARM_PREL31
#endif
&& r_type != R_ARM_PLT32)
{
@@ -3197,6 +3191,7 @@ elf32_arm_relocate_section (bfd *
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
+ case R_ARM_PREL31:
#endif
case R_ARM_ABS32:
case R_ARM_THM_PC22:
@@ -3888,9 +3883,6 @@ elf32_arm_gc_sweep_hook (bfd *
h->plt.refcount -= 1;
if (r_type == R_ARM_ABS32
-#ifndef OLD_ARM_ABI
- || r_type == R_ARM_PREL31
-#endif
|| r_type == R_ARM_REL32)
{
eh = (struct elf32_arm_link_hash_entry *) h;
@@ -4039,6 +4031,7 @@ elf32_arm_check_relocs (bfd *abfd, struc
#ifndef OLD_ARM_ABI
|| r_type == R_ARM_CALL
|| r_type == R_ARM_JUMP24
+ || r_type == R_ARM_PREL31
#endif
|| r_type == R_ARM_PLT32)
h->needs_plt = 1;
@@ -4153,9 +4146,6 @@ elf32_arm_check_relocs (bfd *abfd, struc
}
if (r_type == R_ARM_ABS32
-#ifndef OLD_ARM_ABI
- || r_type == R_ARM_PREL31
-#endif
|| r_type == R_ARM_REL32)
p->count += 1;
}