Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elflink.c
index b9597cb6e14807cb86482827e2ada4812a186af5..22d7d2679ad02cdd667e70f6a391de93428c59bc 100644 (file)
@@ -1,5 +1,5 @@
 /* ELF linking support for BFD.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
+   Copyright (C) 1995-2018 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -881,9 +881,9 @@ elf_link_renumber_local_hash_table_dynsyms (struct elf_link_hash_entry *h,
 /* Return true if the dynamic symbol for a given section should be
    omitted when creating a shared library.  */
 bfd_boolean
-_bfd_elf_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
-                                  struct bfd_link_info *info,
-                                  asection *p)
+_bfd_elf_omit_section_dynsym_default (bfd *output_bfd ATTRIBUTE_UNUSED,
+                                     struct bfd_link_info *info,
+                                     asection *p)
 {
   struct elf_link_hash_table *htab;
   asection *ip;
@@ -913,11 +913,23 @@ _bfd_elf_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
     }
 }
 
+bfd_boolean
+_bfd_elf_omit_section_dynsym_all
+    (bfd *output_bfd ATTRIBUTE_UNUSED,
+     struct bfd_link_info *info ATTRIBUTE_UNUSED,
+     asection *p ATTRIBUTE_UNUSED)
+{
+  return TRUE;
+}
+
 /* Assign dynsym indices.  In a shared library we generate a section
    symbol for each output section, which come first.  Next come symbols
    which have been forced to local binding.  Then all of the back-end
    allocated local dynamic syms, followed by the rest of the global
-   symbols.  */
+   symbols.  If SECTION_SYM_COUNT is NULL, section dynindx is not set.
+   (This prevents the early call before elf_backend_init_index_section
+   and strip_excluded_output_sections setting dynindx for sections
+   that are stripped.)  */
 
 static unsigned long
 _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
@@ -925,6 +937,7 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
                                unsigned long *section_sym_count)
 {
   unsigned long dynsymcount = 0;
+  bfd_boolean do_sec = section_sym_count != NULL;
 
   if (bfd_link_pic (info)
       || elf_hash_table (info)->is_relocatable_executable)
@@ -935,11 +948,16 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
        if ((p->flags & SEC_EXCLUDE) == 0
            && (p->flags & SEC_ALLOC) != 0
            && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
-         elf_section_data (p)->dynindx = ++dynsymcount;
-       else
+         {
+           ++dynsymcount;
+           if (do_sec)
+             elf_section_data (p)->dynindx = dynsymcount;
+         }
+       else if (do_sec)
          elf_section_data (p)->dynindx = 0;
     }
-  *section_sym_count = dynsymcount;
+  if (do_sec)
+    *section_sym_count = dynsymcount;
 
   elf_link_hash_traverse (elf_hash_table (info),
                          elf_link_renumber_local_hash_table_dynsyms,
@@ -5413,7 +5431,7 @@ _bfd_elf_archive_symbol_lookup (bfd *abfd,
   len = strlen (name);
   copy = (char *) bfd_alloc (abfd, len);
   if (copy == NULL)
-    return (struct elf_link_hash_entry *) 0 - 1;
+    return (struct elf_link_hash_entry *) -1;
 
   first = p - name + 1;
   memcpy (copy, name, first);
@@ -5511,7 +5529,7 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
            }
 
          h = archive_symbol_lookup (abfd, info, symdef->name);
-         if (h == (struct elf_link_hash_entry *) 0 - 1)
+         if (h == (struct elf_link_hash_entry *) -1)
            goto error_return;
 
          if (h == NULL)
@@ -6831,8 +6849,6 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
 
   if (dynobj != NULL && elf_hash_table (info)->dynamic_sections_created)
     {
-      unsigned long section_sym_count;
-
       if (elf_tdata (output_bfd)->cverdefs)
        {
          unsigned int crefs = elf_tdata (output_bfd)->cverdefs;
@@ -6874,8 +6890,7 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
 
       if ((elf_tdata (output_bfd)->cverrefs == 0
           && elf_tdata (output_bfd)->cverdefs == 0)
-         || _bfd_elf_link_renumber_dynsyms (output_bfd, info,
-                                            &section_sym_count) <= 1)
+         || _bfd_elf_link_renumber_dynsyms (output_bfd, info, NULL) <= 1)
        {
          asection *s;
 
@@ -6895,7 +6910,7 @@ _bfd_elf_init_1_index_section (bfd *output_bfd, struct bfd_link_info *info)
 
   for (s = output_bfd->sections; s != NULL; s = s->next)
     if ((s->flags & (SEC_EXCLUDE | SEC_ALLOC)) == SEC_ALLOC
-       && !_bfd_elf_link_omit_section_dynsym (output_bfd, info, s))
+       && !_bfd_elf_omit_section_dynsym_default (output_bfd, info, s))
       {
        elf_hash_table (info)->text_index_section = s;
        break;
@@ -6913,7 +6928,7 @@ _bfd_elf_init_2_index_sections (bfd *output_bfd, struct bfd_link_info *info)
      _bfd_elf_link_omit_section_dynsym.  */
   for (s = output_bfd->sections; s != NULL; s = s->next)
     if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
-       && !_bfd_elf_link_omit_section_dynsym (output_bfd, info, s))
+       && !_bfd_elf_omit_section_dynsym_default (output_bfd, info, s))
       {
        elf_hash_table (info)->data_index_section = s;
        break;
@@ -6922,7 +6937,7 @@ _bfd_elf_init_2_index_sections (bfd *output_bfd, struct bfd_link_info *info)
   for (s = output_bfd->sections; s != NULL; s = s->next)
     if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY))
         == (SEC_ALLOC | SEC_READONLY))
-       && !_bfd_elf_link_omit_section_dynsym (output_bfd, info, s))
+       && !_bfd_elf_omit_section_dynsym_default (output_bfd, info, s))
       {
        elf_hash_table (info)->text_index_section = s;
        break;
@@ -11612,6 +11627,13 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
          else
            o->flags |= SEC_EXCLUDE;
        }
+      else if ((o->flags & SEC_GROUP) != 0 && o->size == 0)
+       {
+         /* Remove empty group section from linker output.  */
+         o->flags |= SEC_EXCLUDE;
+         bfd_section_list_remove (abfd, o);
+         abfd->section_count--;
+       }
     }
 
   /* Count up the number of relocations we will output for each output
@@ -13271,7 +13293,7 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
 
   if ((h->root.type == bfd_link_hash_defined
        || h->root.type == bfd_link_hash_defweak)
-      && (h->ref_dynamic
+      && ((h->ref_dynamic && !h->forced_local)
          || ((h->def_regular || ELF_COMMON_DEF_P (h))
              && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
              && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
@@ -13422,11 +13444,19 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
 
       /* Start at sections marked with SEC_KEEP (ref _bfd_elf_gc_keep).
         Also treat note sections as a root, if the section is not part
-        of a group.  */
+        of a group.  We must keep all PREINIT_ARRAY, INIT_ARRAY as
+        well as FINI_ARRAY sections for ld -r.  */
       for (o = sub->sections; o != NULL; o = o->next)
        if (!o->gc_mark
            && (o->flags & SEC_EXCLUDE) == 0
            && ((o->flags & SEC_KEEP) != 0
+               || (bfd_link_relocatable (info)
+                   && ((elf_section_data (o)->this_hdr.sh_type
+                        == SHT_PREINIT_ARRAY)
+                       || (elf_section_data (o)->this_hdr.sh_type
+                           == SHT_INIT_ARRAY)
+                       || (elf_section_data (o)->this_hdr.sh_type
+                           == SHT_FINI_ARRAY)))
                || (elf_section_data (o)->this_hdr.sh_type == SHT_NOTE
                    && elf_next_in_group (o) == NULL )))
          {
@@ -14324,8 +14354,9 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
   if (h != NULL
       && (h->root.type == bfd_link_hash_undefined
          || h->root.type == bfd_link_hash_undefweak
-         || (h->ref_regular && !h->def_regular)))
+         || ((h->ref_regular || h->def_dynamic) && !h->def_regular)))
     {
+      bfd_boolean was_dynamic = h->ref_dynamic || h->def_dynamic;
       h->root.type = bfd_link_hash_defined;
       h->root.u.def.section = sec;
       h->root.u.def.value = 0;
@@ -14340,8 +14371,13 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
          bed = get_elf_backend_data (info->output_bfd);
          (*bed->elf_backend_hide_symbol) (info, h, TRUE);
        }
-      else if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
-       h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_PROTECTED;
+      else
+       {
+         if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
+           h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_PROTECTED;
+         if (was_dynamic)
+           bfd_elf_link_record_dynamic_symbol (info, h);
+       }
       return &h->root;
     }
   return NULL;
This page took 0.029038 seconds and 4 git commands to generate.