mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
1be5d8d3bb
Spectre variant 2 mitigation for PowerPC and PowerPC64. bfd/ * elf32-ppc.c (GLINK_ENTRY_SIZE): Handle speculation barrier. (CRSETEQ, BEQCTRM): Define. (is_nonpic_glink_stub): Don't check bctr. (ppc_elf_link_hash_table_create): Init new ppc_elf_params field. (ppc_elf_relax_section): Size speculation barrier. (output_bctr): New function. (write_glink_stub): Use output_bctr. (ppc_elf_relocate_section): Use output_bctr for long branch stub. (ppc_elf_finish_dynamic_symbol): Likewise. (ppc_elf_finish_dynamic_sections): Use output_bctr. * elf32-ppc.h (struct ppc_elf_params): Add speculate_indirect_jumps. * elf64-ppc.c (CRSETEQ, BEQCTRM, BEQCTRLM): Define. (GLINK_PLTRESOLVE_SIZE): Size speculation barrier. (size_global_entry_stubs): Handle speculation barrier sizing. (plt_stub_size): Likewise. (output_bctr): New function. (build_plt_stub, build_tls_get_addr_stub): Output speculation barrier. (ppc_build_one_stub): Likewise for ppc_stub_plt_branch. (ppc_size_one_stub): Size speculation barrier in ppc_stub_plt_branch. (build_global_entry_stubs): Output speculation barrier. (ppc64_elf_build_stubs): Likewise in __glink_PLTresolve stub. * elf64-ppc.h (struct ppc64_elf_params): Add speculate_indirect_jumps. gold/ * options.h (speculate_indirect_jumps): New option. * powerpc.cc (beqctrm, beqctrlm, crseteq): New insn constants. (output_bctr): New function. (Stub_table::plt_call_size): Add space for speculation barrier. (Stub_table::branch_stub_size): Likewise. (Output_data_glink::pltresolve_size): Likewise. (Stub_table::do_write): Output speculation barriers. ld/ * emultempl/ppc32elf.em (params): Init new field. (OPTION_SPECULATE_INDIRECT_JUMPS): Define. (OPTION_NO_SPECULATE_INDIRECT_JUMPS): Define. (PARSE_AND_LIST_LONGOPTS): Handle new options. (PARSE_AND_LIST_ARGS_CASES): Likewise. (PARSE_AND_LIST_OPTIONS): Likewise. * emultempl/ppc64elf.em (params): Init new field. (OPTION_SPECULATE_INDIRECT_JUMPS): Define. (OPTION_NO_SPECULATE_INDIRECT_JUMPS): Define. (PARSE_AND_LIST_LONGOPTS): Handle --speculate-indirect-jumps. (PARSE_AND_LIST_OPTIONS): Likewise. (PARSE_AND_LIST_ARGS_CASES): Likewise. * ld.texinfo (--no-plt-thread-safe): Correct itemx. (--speculate-indirect-jumps): Document. * testsuite/ld-powerpc/elfv2exe.d, * testsuite/ld-powerpc/elfv2so.d, * testsuite/ld-powerpc/relbrlt.d, * testsuite/ld-powerpc/powerpc.exp: Disable plt alignment and speculation barriers on various tests.
72 lines
2.4 KiB
C
72 lines
2.4 KiB
C
/* PowerPC-specific support for 64-bit ELF.
|
|
Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
enum ppc_elf_plt_type
|
|
{
|
|
PLT_UNSET,
|
|
PLT_OLD,
|
|
PLT_NEW,
|
|
PLT_VXWORKS
|
|
};
|
|
|
|
/* Various options passed from the linker to bfd backend. */
|
|
struct ppc_elf_params
|
|
{
|
|
/* Chooses the type of .plt. */
|
|
enum ppc_elf_plt_type plt_style;
|
|
|
|
/* Set if individual PLT call stubs should be aligned. */
|
|
int plt_stub_align;
|
|
|
|
/* Clear if PLT call stubs should use a speculative execution barrier. */
|
|
int speculate_indirect_jumps;
|
|
|
|
/* Whether to emit symbols for stubs. */
|
|
int emit_stub_syms;
|
|
|
|
/* Whether to emit special stub for __tls_get_addr calls. */
|
|
int no_tls_get_addr_opt;
|
|
|
|
/* Insert trampolines for branches that won't reach their destination. */
|
|
int branch_trampolines;
|
|
|
|
/* Avoid execution falling into new page. */
|
|
int ppc476_workaround;
|
|
unsigned int pagesize_p2;
|
|
|
|
/* The bfd backend detected a non-PIC reference to a protected symbol
|
|
defined in a shared library. */
|
|
int pic_fixup;
|
|
|
|
/* Relocate 16A relocs as 16D and vice versa. */
|
|
int vle_reloc_fixup;
|
|
|
|
bfd_vma pagesize;
|
|
};
|
|
|
|
void ppc_elf_link_params (struct bfd_link_info *, struct ppc_elf_params *);
|
|
int ppc_elf_select_plt_layout (bfd *, struct bfd_link_info *);
|
|
asection *ppc_elf_tls_setup (bfd *, struct bfd_link_info *);
|
|
bfd_boolean ppc_elf_tls_optimize (bfd *, struct bfd_link_info *);
|
|
void ppc_elf_maybe_strip_sdata_syms (struct bfd_link_info *);
|
|
extern bfd_boolean ppc_elf_modify_segment_map (bfd *,
|
|
struct bfd_link_info * ATTRIBUTE_UNUSED);
|
|
extern bfd_boolean ppc_elf_section_processing (bfd *, Elf_Internal_Shdr *);
|