# This shell script emits a C file. -*- C -*-
-# Copyright (C) 2009-2016 Free Software Foundation, Inc.
+# Copyright (C) 2009-2019 Free Software Foundation, Inc.
# Contributed by ARM Ltd.
#
# This file is part of the GNU Binutils.
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;
static void
gld${EMULATION_NAME}_before_parse (void)
input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
+ link_info.check_relocs_after_open_input = TRUE;
link_info.relro = DEFAULT_LD_Z_RELRO;
}
{
/* Here we rummage through the found bfds to collect information. */
LANG_FOR_EACH_INPUT_STATEMENT (is)
- {
- /* Initialise mapping tables for code/data. */
- bfd_elf${ELFSIZE}_aarch64_init_maps (is->the_bfd);
- }
+ {
+ /* Initialise mapping tables for code/data. */
+ bfd_elf${ELFSIZE}_aarch64_init_maps (is->the_bfd);
+ }
}
/* Call the standard elf routine. */
if (stub_sec == NULL)
goto err_ret;
- bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 2);
+ /* 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);
output_section = input_section->output_section;
os = lang_output_section_get (output_section);
return stub_sec;
err_ret:
- einfo ("%X%P: can not make stub section: %E\n");
+ einfo (_("%X%P: can not make stub section: %E\n"));
return NULL;
}
ret = bfd_elf_discard_info (link_info.output_bfd, & link_info);
if (ret < 0)
{
- einfo ("%X%P: .eh_frame/.stab edit: %E\n");
+ einfo (_("%X%P: .eh_frame/.stab edit: %E\n"));
return;
}
else if (ret > 0)
{
if (ret < 0)
{
- einfo ("%X%P: could not compute sections lists for stub generation: %E\n");
+ einfo (_("%X%P: could not compute sections lists "
+ "for stub generation: %E\n"));
return;
}
& elf${ELFSIZE}_aarch64_add_stub_section,
& gldaarch64_layout_sections_again))
{
- einfo ("%X%P: cannot size stub section: %E\n");
+ einfo (_("%X%P: can not size stub section: %E\n"));
return;
}
}
if (stub_file->the_bfd->sections != NULL)
{
if (! elf${ELFSIZE}_aarch64_build_stubs (& link_info))
- einfo ("%X%P: can not build stubs: %E\n");
+ einfo (_("%X%P: can not build stubs: %E\n"));
}
}
These will only be created if the output format is an arm format,
hence we do not support linking and changing output formats at the
same time. Use a link followed by objcopy to change output formats. */
- einfo ("%F%X%P: error: Cannot change output format whilst linking AArch64 binaries.\n");
+ einfo (_("%F%P: error: cannot change output format "
+ "whilst linking %s binaries\n"), "AArch64");
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,
bfd_get_arch (link_info.output_bfd),
bfd_get_mach (link_info.output_bfd)))
{
- einfo ("%X%P: can not create BFD %E\n");
+ einfo (_("%F%P: can not create BFD: %E\n"));
return;
}
PARSE_AND_LIST_PROLOGUE='
#define OPTION_NO_ENUM_SIZE_WARNING 309
#define OPTION_PIC_VENEER 310
-#define OPTION_STUBGROUP_SIZE 311
+#define OPTION_STUBGROUP_SIZE 311
#define OPTION_NO_WCHAR_SIZE_WARNING 312
#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
{ "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='
fprintf (file, _(" --no-enum-size-warning Don'\''t warn about objects with incompatible\n"
" enum sizes\n"));
- fprintf (file, _(" --no-wchar-size-warning Don'\''t warn about objects with incompatible"
+ fprintf (file, _(" --no-wchar-size-warning Don'\''t warn about objects with incompatible\n"
" wchar_t sizes\n"));
fprintf (file, _(" --pic-veneer Always generate PIC interworking veneers\n"));
fprintf (file, _("\
- --stub-group-size=N Maximum size of a group of input sections that can be\n\
- handled by one stub section. A negative value\n\
- locates all stubs after their branches (with a\n\
- group size of -N), while a positive value allows\n\
- two groups of input sections, one before, and one\n\
- after each stub section. Values of +/-1 indicate\n\
- the linker should choose suitable defaults.\n"
- ));
+ --stub-group-size=N Maximum size of a group of input sections that\n\
+ can be handled by one stub section. A negative\n\
+ value locates all stubs after their branches\n\
+ (with a group size of -N), while a positive\n\
+ value allows two groups of input sections, one\n\
+ before, and one after each stub section.\n\
+ 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, _(" --no-apply-dynamic-relocs Do not apply link-time values for dynamic relocations\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"));
'
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;
- group_size = bfd_scan_vma (optarg, &end, 0);
- if (*end)
- einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
+ group_size = bfd_scan_vma (optarg, &end, 0);
+ if (*end)
+ einfo (_("%F%P: invalid number `%s'\''\n"), optarg);
}
break;
'