X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Faarch64elf.em;h=f4baf508958714c824b8670ee4a01dfe9a7d254f;hb=0b11474080800192797236e30857a42818f5560d;hp=bfe8d1b179230a6ba32be42b2105180f4cd72446;hpb=1dbade7441b9f32d6ba9aa1d44da5f28c44282fa;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em index bfe8d1b179..f4baf50895 100644 --- a/ld/emultempl/aarch64elf.em +++ b/ld/emultempl/aarch64elf.em @@ -19,19 +19,20 @@ # 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_name, flags); @@ -178,7 +179,7 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name, /* Long branch stubs contain a 64-bit address, so the section requires 8 byte alignment. */ - bfd_set_section_alignment (stub_file->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); @@ -206,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; } @@ -217,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) @@ -275,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 @@ -339,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 @@ -372,8 +353,6 @@ PARSE_AND_LIST_PROLOGUE=' #define OPTION_FIX_ERRATUM_835769 313 #define OPTION_FIX_ERRATUM_843419 314 #define OPTION_NO_APPLY_DYNAMIC_RELOCS 315 -#define OPTION_FORCE_BTI 316 -#define OPTION_PAC_PLT 317 ' PARSE_AND_LIST_SHORTOPTS=p @@ -385,10 +364,8 @@ 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}, - { "force-bti", no_argument, NULL, OPTION_FORCE_BTI}, - { "pac-plt", no_argument, NULL, OPTION_PAC_PLT}, ' PARSE_AND_LIST_OPTIONS=' @@ -407,12 +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, _(" --force-bti Turn on Branch Target Identification mechanism and generate PLTs with BTI. Generate warnings for missing BTI on inputs\n")); - fprintf (file, _(" --pac-plt Protect PLTs with Pointer Authentication.\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. */ @@ -435,22 +433,25 @@ 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: no_apply_dynamic_relocs = 1; break; - case OPTION_FORCE_BTI: - plt_type |= PLT_BTI; - bti_type = BTI_WARN; - break; - - case OPTION_PAC_PLT: - plt_type |= PLT_PAC; - break; - case OPTION_STUBGROUP_SIZE: { const char *end;