mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-10 17:38:04 +08:00
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.
This commit is contained in:
@ -1,3 +1,13 @@
|
||||
2020-09-24 Alan Modra <amodra@gmail.com>
|
||||
|
||||
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 <amodra@gmail.com>
|
||||
|
||||
PR 26569
|
||||
|
@ -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
|
||||
|
@ -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 *);
|
||||
|
@ -1,3 +1,10 @@
|
||||
2020-09-24 Alan Modra <amodra@gmail.com>
|
||||
|
||||
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 <fziglio@redhat.com>
|
||||
|
||||
* emultempl/pe.em (set_entry_point): Only use the DLL entry point
|
||||
|
@ -32,10 +32,12 @@ fragment <<EOF
|
||||
|
||||
static asection *ppc_add_stub_section (const char *, asection *);
|
||||
static void ppc_layout_sections_again (void);
|
||||
static void ppc_edit (void);
|
||||
|
||||
static struct ppc64_elf_params params = { NULL,
|
||||
&ppc_add_stub_section,
|
||||
&ppc_layout_sections_again,
|
||||
&ppc_edit,
|
||||
1, -1, -1, 0,
|
||||
${DEFAULT_PLT_STATIC_CHAIN-0}, -1, 5,
|
||||
-1, -1, 0, 0, -1, -1, 0};
|
||||
@ -294,7 +296,19 @@ ppc_before_allocation (void)
|
||||
einfo (_("%X%P: inline PLT: %E\n"));
|
||||
}
|
||||
|
||||
if (ppc64_elf_tls_setup (&link_info)
|
||||
if (!ppc64_elf_tls_setup (&link_info))
|
||||
einfo (_("%X%P: TLS problem %E\n"));
|
||||
}
|
||||
|
||||
gld${EMULATION_NAME}_before_allocation ();
|
||||
}
|
||||
|
||||
static void
|
||||
ppc_edit (void)
|
||||
{
|
||||
if (stub_file != NULL)
|
||||
{
|
||||
if (elf_hash_table (&link_info)->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
|
||||
|
Reference in New Issue
Block a user