From c94053440e29421dd8846530da73f09c9ede2e0f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 23 Sep 2020 14:55:39 +0930 Subject: [PATCH] PR26655, Power10 libstdc++.so R_PPC64_NONE dynamic relocs Some of the powerpc64 code editing functions are better run after dynamic symbols have stabilised in order to make proper decisions based on SYMBOL_REFERENCES_LOCAL. The dynamic symbols are processed early in bfd_elf_size_dynamic_sections, before the backend always_size_sections function is called. One function, ppc64_elf_tls_setup must run before bfd_elf_size_dynamic_sections because it changes dynamic symbols. ppc64_elf_edit_opd and ppc64_elf_inline_plt can run early or late, I think. ppc64_elf_tls_optimize and ppc64_elf_edit_toc are better run later. So this patch arranges to call some edit functions later via always_size_sections. PR 26655 bfd/ * elf64-ppc.c (ppc64_elf_func_desc_adjust): Rename to.. (ppc64_elf_edit): Call params->edit. (ppc64_elf_tls_setup): Don't call _bfd_elf_tls_setup. Return a bfd_boolean. * elf64-ppc.h (struct ppc64_elf_params): Add "edit". (ppc64_elf_tls_setup): Update declaration. ld/ * emultempl/ppc64elf.em (params): Add ppc_edit. (ppc_before_allocation): Split off some edit functions to.. (ppc_edit): ..this, new function. --- bfd/ChangeLog | 10 ++++++++++ bfd/elf64-ppc.c | 27 ++++++++++++++++----------- bfd/elf64-ppc.h | 3 ++- ld/ChangeLog | 7 +++++++ ld/emultempl/ppc64elf.em | 18 +++++++++++++++--- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 608e3c796c0..39e5ead6d73 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2020-09-24 Alan Modra + + PR 26655 + * elf64-ppc.c (ppc64_elf_func_desc_adjust): Rename to.. + (ppc64_elf_edit): Call params->edit. + (ppc64_elf_tls_setup): Don't call _bfd_elf_tls_setup. Return a + bfd_boolean. + * elf64-ppc.h (struct ppc64_elf_params): Add "edit". + (ppc64_elf_tls_setup): Update declaration. + 2020-09-21 Alan Modra PR 26569 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 06202c94a3c..4d16dc3cd46 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -114,7 +114,7 @@ static bfd_vma opd_entry_value #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol #define elf_backend_hide_symbol ppc64_elf_hide_symbol #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym -#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust +#define elf_backend_always_size_sections ppc64_elf_edit #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections #define elf_backend_hash_symbol ppc64_elf_hash_symbol #define elf_backend_init_index_section _bfd_elf_init_2_index_sections @@ -6341,13 +6341,13 @@ static const struct sfpr_def_parms save_res_funcs[] = }; /* Called near the start of bfd_elf_size_dynamic_sections. We use - this hook to a) provide some gcc support functions, and b) transfer - dynamic linking information gathered so far on function code symbol - entries, to their corresponding function descriptor symbol entries. */ + this hook to a) run the edit functions in this file, b) provide + some gcc support functions, and c) transfer dynamic linking + information gathered so far on function code symbol entries, to + their corresponding function descriptor symbol entries. */ static bfd_boolean -ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info) +ppc64_elf_edit (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { struct ppc_link_hash_table *htab; @@ -6355,6 +6355,9 @@ ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED, if (htab == NULL) return FALSE; + /* Call back into the linker, which then runs the edit functions. */ + htab->params->edit (); + /* Provide any missing _save* and _rest* functions. */ if (htab->sfpr != NULL) { @@ -7695,9 +7698,11 @@ ppc64_elf_inline_plt (struct bfd_link_info *info) return TRUE; } -/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */ +/* Set htab->tls_get_addr and various other info specific to TLS. + This needs to run before dynamic symbols are processed in + bfd_elf_size_dynamic_sections. */ -asection * +bfd_boolean ppc64_elf_tls_setup (struct bfd_link_info *info) { struct ppc_link_hash_table *htab; @@ -7705,7 +7710,7 @@ ppc64_elf_tls_setup (struct bfd_link_info *info) htab = ppc_hash_table (info); if (htab == NULL) - return NULL; + return FALSE; if (abiversion (info->output_bfd) == 1) htab->opd_abi = 1; @@ -7827,7 +7832,7 @@ ppc64_elf_tls_setup (struct bfd_link_info *info) _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, opt_fd->dynstr_index); if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd)) - return NULL; + return FALSE; } if (tga_fd != NULL) { @@ -7886,7 +7891,7 @@ ppc64_elf_tls_setup (struct bfd_link_info *info) && htab->params->no_tls_get_addr_regsave == -1) htab->params->no_tls_get_addr_regsave = 0; - return _bfd_elf_tls_setup (info->output_bfd, info); + return TRUE; } /* Return TRUE iff REL is a branch reloc with a global symbol matching diff --git a/bfd/elf64-ppc.h b/bfd/elf64-ppc.h index a7230de81c0..0492fd7fad5 100644 --- a/bfd/elf64-ppc.h +++ b/bfd/elf64-ppc.h @@ -27,6 +27,7 @@ struct ppc64_elf_params /* Linker call-backs. */ asection * (*add_stub_section) (const char *, asection *); void (*layout_sections_again) (void); + void (*edit) (void); /* Maximum size of a group of input sections that can be handled by one stub section. A value of +/-1 indicates the bfd back-end @@ -80,7 +81,7 @@ bfd_boolean ppc64_elf_edit_opd (struct bfd_link_info *); bfd_boolean ppc64_elf_inline_plt (struct bfd_link_info *); -asection *ppc64_elf_tls_setup +bfd_boolean ppc64_elf_tls_setup (struct bfd_link_info *); bfd_boolean ppc64_elf_tls_optimize (struct bfd_link_info *); diff --git a/ld/ChangeLog b/ld/ChangeLog index dfa58a9ebaa..0662ac2ca78 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2020-09-24 Alan Modra + + PR 26655 + * emultempl/ppc64elf.em (params): Add ppc_edit. + (ppc_before_allocation): Split off some edit functions to.. + (ppc_edit): ..this, new function. + 2020-09-22 Frediano Ziglio * emultempl/pe.em (set_entry_point): Only use the DLL entry point diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index 42b9bd48fcc..2df5a218e6a 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -32,10 +32,12 @@ fragment <tls_sec != NULL && !no_tls_opt) { /* Size the sections. This is premature, but we want to know the @@ -323,8 +337,6 @@ ppc_before_allocation (void) sort_toc_sections (&toc_os->children, NULL, NULL); } } - - gld${EMULATION_NAME}_before_allocation (); } struct hook_stub_info -- 2.30.2