summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-04-28 06:38:41 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-04-28 06:38:41 -0700
commit16526e42c26b00e2424a0d0b5a73c04f010f7a9e (patch)
tree20752987a40d18286eb125e6cf939bb64317d77c
parent316b611580f1dd4242863f0fcded588980fe9e07 (diff)
downloadbinutils-gdb-users/hjl/link_assignments.tar.gz
Add _bfd_elf_record_start_stopusers/hjl/link_assignments
-rw-r--r--bfd/elf-bfd.h3
-rw-r--r--bfd/elflink.c21
-rw-r--r--ld/emultempl/elf32.em2
3 files changed, 26 insertions, 0 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 6c05b55b641..480f1cb444e 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -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 *);
diff --git a/bfd/elflink.c b/bfd/elflink.c
index b6ff6b650a9..6c2ddb4b7e3 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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);
+}
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index cc2f056602c..ad48ce47cbc 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -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);
}
}