summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-04-19 14:21:15 +0930
committerAlan Modra <amodra@gmail.com>2023-04-20 09:03:53 +0930
commit2605f35cda6ec0710ad87e14912dd4ee537e674e (patch)
treef08fe08ae38e89a1597a7b38a60447fc710a4c2c /ld
parent329dd2b6fcad4b3f1c4b0d443381f7c68ef18a9f (diff)
downloadbinutils-gdb-2605f35cda6ec0710ad87e14912dd4ee537e674e.tar.gz
PR30343 infrastructure
Make ldemul_before_plugin_all_symbols_read more useful. * ldlang.c (lang_process): Move call to ldemul_before_plugin_all_symbols_read outside BFD_SUPPORTS_PLUGINS. Allow backends to add to gc_sym_list before handling entry sym. * ldelf.c (ldelf_before_plugin_all_symbols_read): Test lto_plugin_active.
Diffstat (limited to 'ld')
-rw-r--r--ld/ldelf.c3
-rw-r--r--ld/ldlang.c16
2 files changed, 10 insertions, 9 deletions
diff --git a/ld/ldelf.c b/ld/ldelf.c
index eff6693e052..f9a6819366f 100644
--- a/ld/ldelf.c
+++ b/ld/ldelf.c
@@ -1215,7 +1215,8 @@ ldelf_before_plugin_all_symbols_read (int use_libpath, int native,
{
struct elf_link_hash_table *htab = elf_hash_table (&link_info);
- if (!is_elf_hash_table (&htab->root))
+ if (!link_info.lto_plugin_active
+ || !is_elf_hash_table (&htab->root))
return;
htab->handling_dt_needed = true;
diff --git a/ld/ldlang.c b/ld/ldlang.c
index b684e2d479a..006031b5a65 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7964,14 +7964,14 @@ lang_process (void)
statements we can give values to symbolic origin/length now. */
lang_do_memory_regions (true);
+ ldemul_before_plugin_all_symbols_read ();
+
#if BFD_SUPPORTS_PLUGINS
if (link_info.lto_plugin_active)
{
lang_statement_list_type added;
lang_statement_list_type files, inputfiles;
- ldemul_before_plugin_all_symbols_read ();
-
/* Now all files are read, let the plugin(s) decide if there
are any more to be added to the link before we call the
emulation's after_open hook. We create a private list of
@@ -8074,17 +8074,17 @@ lang_process (void)
}
#endif /* BFD_SUPPORTS_PLUGINS */
- /* Make sure that nobody has tried to add a symbol to this list
- before now. */
- ASSERT (link_info.gc_sym_list == NULL);
+ struct bfd_sym_chain **sym = &link_info.gc_sym_list;
+ while (*sym)
+ sym = &(*sym)->next;
- link_info.gc_sym_list = &entry_symbol;
+ *sym = &entry_symbol;
if (entry_symbol.name == NULL)
{
- link_info.gc_sym_list = ldlang_undef_chain_list_head;
+ *sym = ldlang_undef_chain_list_head;
- /* entry_symbol is normally initialied by a ENTRY definition in the
+ /* entry_symbol is normally initialised by an ENTRY definition in the
linker script or the -e command line option. But if neither of
these have been used, the target specific backend may still have
provided an entry symbol via a call to lang_default_entry().