aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl/aarch64elf.em
diff options
context:
space:
mode:
Diffstat (limited to 'ld/emultempl/aarch64elf.em')
-rw-r--r--ld/emultempl/aarch64elf.em30
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: