This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
RFA: Fix up ARM PLT problems
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: binutils at sources dot redhat dot com
- Date: Fri, 13 Sep 2002 18:59:56 -0400
- Subject: RFA: Fix up ARM PLT problems
(Is anyone using current binutils in userspace on ARM/Linux? I couldn't
build working applications without this patch.)
This just brings elf32-arm.h in line with other ports for choosing when PLT
entries are needed. Without this, the PLT entry pointing at a hidden symbol
in glibc would not be emitted, and it would be replaced with some R_ARM_NONE
relocs and a bunch of NULL bytes in the middle of the PLT. But things would
still jump to it and crash. Look reasonable?
This has been in testing on elf32 ARM/Linux for two weeks now and appears to
be working well.
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
2002-09-13 Daniel Jacobowitz <drow@mvista.com>
* elf32-arm.h (elf32_arm_adjust_dynamic_symbol): Update
ELF_LINK_HASH_NEEDS_PLT logic.
Index: bfd/elf32-arm.h
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.h,v
retrieving revision 1.92
diff -u -p -r1.92 elf32-arm.h
--- bfd/elf32-arm.h 12 Sep 2002 13:18:57 -0000 1.92
+++ bfd/elf32-arm.h 13 Sep 2002 22:55:58 -0000
@@ -2966,16 +2966,22 @@ elf32_arm_adjust_dynamic_symbol (info, h
if (h->type == STT_FUNC
|| (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
{
+ /* If we link a program (not a DSO), we'll get rid of unnecessary
+ PLT entries; we point to the actual symbols -- even for pic
+ relocs, because a program built with -fpic should have the same
+ result as one built without -fpic, specifically considering weak
+ symbols.
+ FIXME: m68k and i386 differ here, for unclear reasons. */
if (! info->shared
- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
- && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
+ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0)
{
/* This case can occur if we saw a PLT32 reloc in an input
- file, but the symbol was never referred to by a dynamic
- object. In such a case, we don't actually need to build
- a procedure linkage table, and we can just do a PC32
- reloc instead. */
+ file, but the symbol was not defined by a dynamic object.
+ In such a case, we don't actually need to build a
+ procedure linkage table, and we can just do a PC32 reloc
+ instead. */
BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
+ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
return true;
}