From eedecc0705321aba4d85787ab3901d65ad01dd76 Mon Sep 17 00:00:00 2001 From: David Daney Date: Fri, 29 Jul 2005 23:24:01 +0000 Subject: [PATCH] * elfxx-mips.c (_bfd_mips_elf_add_symbol_hook): Ignore _gp_disp if it is in the *ABS* section. --- bfd/ChangeLog | 5 +++++ bfd/elfxx-mips.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b52a2ec..ef863dc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2005-07-29 David Daney + + * elfxx-mips.c (_bfd_mips_elf_add_symbol_hook): Ignore _gp_disp + if it is in the *ABS* section. + 2005-07-29 Paul Brook * reloc.c: Add BFD_RELOC_ARM_T32_ADD_PC12. diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index bd900e0..316114e 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -5414,6 +5414,20 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return TRUE; } + /* Shared objects may have a dynamic symbol '_gp_disp' defined as + a SECTION *ABS*. This causes ld to think it can resolve _gp_disp + by setting a DT_NEEDED for the shared object. Since _gp_disp is + a magic symbol resolved by the linker, we ignore this bogus definition + of _gp_disp. New ABI objects do not suffer from this problem so this + is not done for them. */ + if (!NEWABI_P(abfd) + && (sym->st_shndx == SHN_ABS) + && (strcmp (*namep, "_gp_disp") == 0)) + { + *namep = NULL; + return TRUE; + } + switch (sym->st_shndx) { case SHN_COMMON: -- 2.7.4