X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Faarch64elf.em;h=d0519b3d7b24542aa7500c1bc706415e48bd4f40;hb=a78a19b15254de31c3d38b7e27469aaef0a30e97;hp=45e40b510cf0da21e777f5734dcc9d1be54918a5;hpb=827041555ac443bd57340060f3e034fd7b199dd8;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em index 45e40b510c..d0519b3d7b 100644 --- a/ld/emultempl/aarch64elf.em +++ b/ld/emultempl/aarch64elf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright (C) 2009-2019 Free Software Foundation, Inc. +# Copyright (C) 2009-2020 Free Software Foundation, Inc. # Contributed by ARM Ltd. # # This file is part of the GNU Binutils. @@ -19,20 +19,23 @@ # see . # -# This file is sourced from elf32.em, and defines extra aarch64-elf +# This file is sourced from elf.em, and defines extra aarch64-elf # specific routines. # fragment <the_bfd, stub_sec, 3); + bfd_set_section_alignment (stub_sec, 3); output_section = input_section->output_section; os = lang_output_section_get (output_section); @@ -204,7 +207,7 @@ gldaarch64_layout_sections_again (void) /* If we have changed sizes of the stub sections, then we need to recalculate all the section offsets. This may mean we need to add even more stubs. */ - gld${EMULATION_NAME}_map_segments (TRUE); + ldelf_map_segments (TRUE); need_laying_out = -1; } @@ -215,7 +218,7 @@ build_section_lists (lang_statement_union_type *statement) { asection *i = statement->input_section.section; - if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms + if (!bfd_input_just_syms (i->owner) && (i->flags & SEC_EXCLUDE) == 0 && i->output_section != NULL && i->output_section->owner == link_info.output_bfd) @@ -273,7 +276,7 @@ gld${EMULATION_NAME}_after_allocation (void) } if (need_laying_out != -1) - gld${EMULATION_NAME}_map_segments (need_laying_out); + ldelf_map_segments (need_laying_out); } static void @@ -308,12 +311,17 @@ aarch64_elf_create_output_section_statements (void) return; } + aarch64_bti_pac_info bp_info; + bp_info.plt_type = plt_type; + bp_info.bti_type = bti_type; + bfd_elf${ELFSIZE}_aarch64_set_options (link_info.output_bfd, &link_info, no_enum_size_warning, no_wchar_size_warning, pic_veneer, fix_erratum_835769, fix_erratum_843419, - no_apply_dynamic_relocs); + no_apply_dynamic_relocs, + bp_info); stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, @@ -332,26 +340,6 @@ aarch64_elf_create_output_section_statements (void) ldlang_add_file (stub_file); } -/* Avoid processing the fake stub_file in vercheck, stat_needed and - check_needed routines. */ - -static void (*real_func) (lang_input_statement_type *); - -static void aarch64_for_each_input_file_wrapper (lang_input_statement_type *l) -{ - if (l != stub_file) - (*real_func) (l); -} - -static void -aarch64_lang_for_each_input_file (void (*func) (lang_input_statement_type *)) -{ - real_func = func; - lang_for_each_input_file (&aarch64_for_each_input_file_wrapper); -} - -#define lang_for_each_input_file aarch64_lang_for_each_input_file - EOF # Define some shell vars to insert bits of code into the standard elf @@ -376,7 +364,7 @@ PARSE_AND_LIST_LONGOPTS=' { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE }, { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING}, { "fix-cortex-a53-835769", no_argument, NULL, OPTION_FIX_ERRATUM_835769}, - { "fix-cortex-a53-843419", no_argument, NULL, OPTION_FIX_ERRATUM_843419}, + { "fix-cortex-a53-843419", optional_argument, NULL, OPTION_FIX_ERRATUM_843419}, { "no-apply-dynamic-relocs", no_argument, NULL, OPTION_NO_APPLY_DYNAMIC_RELOCS}, ' @@ -396,10 +384,33 @@ PARSE_AND_LIST_OPTIONS=' Values of +/-1 indicate the linker should\n\ choose suitable defaults.\n")); fprintf (file, _(" --fix-cortex-a53-835769 Fix erratum 835769\n")); - fprintf (file, _(" --fix-cortex-a53-843419 Fix erratum 843419\n")); + fprintf (file, _("\ + --fix-cortex-a53-843419[=full|adr|adrp] Fix erratum 843419 and optionally specify which workaround to use.\n\ + full (default): Use both ADRP and ADR workaround, this will \n\ + increase the size of your binaries.\n\ + adr: Only use the ADR workaround, this will not cause any increase\n\ + in binary size but linking will fail if the referenced address is\n\ + out of range of an ADR instruction. This will remove the need of using\n\ + a veneer and results in both performance and size benefits.\n\ + adrp: Use only the ADRP workaround, this will never rewrite your ADRP\n\ + instruction into an ADR. As such the workaround will always use a\n\ + veneer and this will give you both a performance and size overhead.\n")); fprintf (file, _(" --no-apply-dynamic-relocs Do not apply link-time values for dynamic relocations\n")); + fprintf (file, _(" -z force-bti Turn on Branch Target Identification mechanism and generate PLTs with BTI. Generate warnings for missing BTI on inputs\n")); + fprintf (file, _(" -z pac-plt Protect PLTs with Pointer Authentication.\n")); ' +PARSE_AND_LIST_ARGS_CASE_Z_AARCH64=' + else if (strcmp (optarg, "force-bti") == 0) + { + plt_type |= PLT_BTI; + bti_type = BTI_WARN; + } + else if (strcmp (optarg, "pac-plt") == 0) + plt_type |= PLT_PAC; +' +PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_AARCH64" + PARSE_AND_LIST_ARGS_CASES=' case '\'p\'': /* Only here for backwards compatibility. */ @@ -422,7 +433,19 @@ PARSE_AND_LIST_ARGS_CASES=' break; case OPTION_FIX_ERRATUM_843419: - fix_erratum_843419 = 1; + fix_erratum_843419 = ERRAT_ADR | ERRAT_ADRP; + if (optarg && *optarg) + { + if (strcmp ("full", optarg) == 0) + fix_erratum_843419 = ERRAT_ADR | ERRAT_ADRP; + else if (strcmp ("adrp", optarg) == 0) + fix_erratum_843419 = ERRAT_ADRP; + else if (strcmp ("adr", optarg) == 0) + fix_erratum_843419 = ERRAT_ADR; + else + einfo (_("%P: error: unrecognized option for " + "--fix-cortex-a53-843419: %s\n"), optarg); + } break; case OPTION_NO_APPLY_DYNAMIC_RELOCS: