Don't generate PLT entries for symbols defined in a regular object for
authorkettenis <kettenis@openbsd.org>
Thu, 25 Dec 2014 23:10:17 +0000 (23:10 +0000)
committerkettenis <kettenis@openbsd.org>
Thu, 25 Dec 2014 23:10:17 +0000 (23:10 +0000)
-static -pie.

On sparc64, avoid generating GLOB_DAT relocs and convert certain absolute
relocs into RELATIVE relocs when we can for -static -pie.

With this change we don't need -Wl,-Bsymbolic anymore when building -static
-pie binaries.

ok millert@, kurt@

gnu/usr.bin/binutils/bfd/elf64-sparc.c
gnu/usr.bin/binutils/bfd/elflink.c

index 1dd92ed..7704bb7 100644 (file)
@@ -2222,7 +2222,8 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                /* h->dynindx may be -1 if the symbol was marked to
                   become local.  */
                else if (h != NULL && ! is_plt
-                        && ((! info->symbolic && h->dynindx != -1)
+                        && ((!info->symbolic && !info->static_link
+                             && h->dynindx != -1)
                             || (h->elf_link_hash_flags
                                 & ELF_LINK_HASH_DEF_REGULAR) == 0))
                  {
@@ -2776,7 +2777,7 @@ sparc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
         The entry in the global offset table will already have been
         initialized in the relocate_section function.  */
       if (info->shared
-         && (info->symbolic || h->dynindx == -1)
+         && (info->symbolic || info->static_link || h->dynindx == -1)
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
        {
          asection *sec = h->root.u.def.section;
index 4707de1..73a8a47 100644 (file)
@@ -2139,7 +2139,7 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
       && eif->info->shared
       && is_elf_hash_table (eif->info->hash)
-      && (eif->info->symbolic
+      && (eif->info->symbolic || eif->info->static_link
          || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
     {