diff options
Diffstat (limited to 'ld/emultempl/aarch64elf.em')
-rw-r--r-- | ld/emultempl/aarch64elf.em | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em index bfe8d1b..b59623e 100644 --- a/ld/emultempl/aarch64elf.em +++ b/ld/emultempl/aarch64elf.em @@ -31,7 +31,7 @@ static int no_enum_size_warning = 0; static int no_wchar_size_warning = 0; static int pic_veneer = 0; static int fix_erratum_835769 = 0; -static int fix_erratum_843419 = 0; +static erratum_84319_opts fix_erratum_843419 = ERRAT_NONE; static int no_apply_dynamic_relocs = 0; static aarch64_plt_type plt_type = PLT_NORMAL; static aarch64_enable_bti_type bti_type = BTI_NONE; @@ -385,7 +385,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}, { "force-bti", no_argument, NULL, OPTION_FORCE_BTI}, { "pac-plt", no_argument, NULL, OPTION_PAC_PLT}, @@ -407,7 +407,17 @@ 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")); @@ -435,7 +445,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: |