]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add _bfd_elf_record_start_stop users/hjl/link_assignments
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 28 Apr 2016 13:38:41 +0000 (06:38 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 28 Apr 2016 13:38:41 +0000 (06:38 -0700)
bfd/elf-bfd.h
bfd/elflink.c
ld/emultempl/elf32.em

index 6c05b55b641f554a11f825a4219dbba9860aa420..480f1cb444ebd6b1886ccb0a750c91cc18e555dd 100644 (file)
@@ -2339,6 +2339,9 @@ extern bfd_boolean bfd_elf_gc_common_final_link
 extern asection *_bfd_elf_is_start_stop
   (const struct bfd_link_info *, struct elf_link_hash_entry *);
 
+extern void _bfd_elf_record_start_stop
+  (const struct bfd_link_info *);
+
 extern bfd_boolean bfd_elf_reloc_symbol_deleted_p
   (bfd_vma, void *);
 
index b6ff6b650a96e897de5ac771175625fae584fbc8..6c2ddb4b7e3bba4782f3e4b1782bbc1801816a6c 100644 (file)
@@ -13791,3 +13791,24 @@ elf_append_rel (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
   BFD_ASSERT (loc + bed->s->sizeof_rel <= s->contents + s->size);
   bed->s->swap_reloc_out (abfd, rel, loc);
 }
+
+/* For undefined __start_<name> and __stop_<name> symbols, set
+   def_regular to 1.  This is called via elf_link_hash_traverse.  */
+
+static bfd_boolean
+elf_link_record_start_stop (struct elf_link_hash_entry *h, void *data)
+{
+  const struct bfd_link_info * info
+    = (const struct bfd_link_info *) data;
+  if (_bfd_elf_is_start_stop (info, h) != NULL)
+    h->def_regular = 1;
+  return TRUE;
+}
+
+void
+_bfd_elf_record_start_stop (const struct bfd_link_info * info)
+{
+  elf_link_hash_traverse (elf_hash_table (info),
+                         elf_link_record_start_stop,
+                         (void *) info);
+}
index cc2f056602c7797e5957eb8d2b8c95a93d5e3499..ad48ce47cbc90e5b072b43e9af8bb7c729c35afd 100644 (file)
@@ -1445,6 +1445,8 @@ gld${EMULATION_NAME}_record_link_assignments (lang_phase_type phase)
         let the ELF backend know about them in case the variables are
         referred to by dynamic objects.  */
       lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
+
+      _bfd_elf_record_start_stop (&link_info);
     }
 }