X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Faarch64elf.em;h=f4baf508958714c824b8670ee4a01dfe9a7d254f;hb=0b11474080800192797236e30857a42818f5560d;hp=75f04a7ec82983dcaec223b553bbcd7bc784744b;hpb=d9ced15d6ea875aadd3e7395990eb37319454d71;p=deliverable%2Fbinutils-gdb.git
diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em
index 75f04a7ec8..f4baf50895 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-2015 Free Software Foundation, Inc.
+# Copyright (C) 2009-2019 Free Software Foundation, Inc.
# Contributed by ARM Ltd.
#
# This file is part of the GNU Binutils.
@@ -19,18 +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);
- }
+ {
+ /* Initialise mapping tables for code/data. */
+ bfd_elf${ELFSIZE}_aarch64_init_maps (is->the_bfd);
+ }
}
/* Call the standard elf routine. */
@@ -163,14 +170,16 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
lang_output_section_statement_type *os;
struct hook_stub_info info;
- flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
+ flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_LINKER_CREATED
| SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
stub_sec_name, flags);
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_sec, 3);
output_section = input_section->output_section;
os = lang_output_section_get (output_section);
@@ -186,7 +195,7 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
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;
}
@@ -198,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;
}
@@ -209,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)
@@ -229,7 +238,7 @@ gld${EMULATION_NAME}_after_allocation (void)
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)
@@ -237,7 +246,7 @@ gld${EMULATION_NAME}_after_allocation (void)
/* If generating a relocatable output file, then we don't
have to examine the relocs. */
- if (stub_file != NULL && !link_info.relocatable)
+ if (stub_file != NULL && !bfd_link_relocatable (&link_info))
{
ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd,
&link_info);
@@ -245,7 +254,8 @@ gld${EMULATION_NAME}_after_allocation (void)
{
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;
}
@@ -259,26 +269,26 @@ gld${EMULATION_NAME}_after_allocation (void)
& 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 (need_laying_out != -1)
- gld${EMULATION_NAME}_map_segments (need_laying_out);
+ ldelf_map_segments (need_laying_out);
}
static void
gld${EMULATION_NAME}_finish (void)
{
- if (! link_info.relocatable)
+ if (!bfd_link_relocatable (&link_info))
{
/* Now build the linker stubs. */
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"));
}
}
@@ -296,14 +306,22 @@ aarch64_elf_create_output_section_statements (void)
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);
+ pic_veneer,
+ fix_erratum_835769, fix_erratum_843419,
+ no_apply_dynamic_relocs,
+ bp_info);
stub_file = lang_add_input_file ("linker stubs",
lang_input_file_is_fake_enum,
@@ -314,7 +332,7 @@ aarch64_elf_create_output_section_statements (void)
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;
}
@@ -322,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
@@ -350,9 +348,11 @@ EOF
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
'
PARSE_AND_LIST_SHORTOPTS=p
@@ -364,25 +364,52 @@ 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", optional_argument, NULL, OPTION_FIX_ERRATUM_843419},
+ { "no-apply-dynamic-relocs", no_argument, NULL, OPTION_NO_APPLY_DYNAMIC_RELOCS},
'
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[=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\'':
@@ -405,13 +432,33 @@ PARSE_AND_LIST_ARGS_CASES='
fix_erratum_835769 = 1;
break;
+ case OPTION_FIX_ERRATUM_843419:
+ 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_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;
'