From: H.J. Lu Date: Wed, 23 Dec 2020 21:00:39 +0000 (-0800) Subject: x86-64: Add Intel LAM property support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=279d901e5a7a16eb9a3383e316ff4a8d7473d6bd;p=binutils-gdb.git x86-64: Add Intel LAM property support Add Intel Linear Address Masking (LAM) property support. LAM modifies the checking that is applied to 64-bit linear addresses, allowing software to use of the untranslated address bits for metadata. bfd/ * elf-linker-x86.h (elf_x86_cet_report): Renamed to ... (elf_x86_prop_report): This. (elf_linker_x86_params): Add lam_u48, lam_u57, lam_u48_report and lam_u57_report. * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Support GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and GNU_PROPERTY_X86_FEATURE_1_LAM_U57. (_bfd_x86_elf_link_fixup_gnu_properties): Keep LAM features only for 64-bit output. binutils/ * NEWS: Mention LAM_U48 and LAM_U57 support. * elfedit.c (elf_x86_feature): Support lam_u48 and lam_u57. (usage): Add lam_u48 and lam_u57. * readelf.c (decode_x86_feature_1): Support LAM_U48 and LAM_U57. * doc/binutils.texi: Update elfedit with lam_u48 and lam_u57 support. * testsuite/binutils-all/x86-64/lam-u48.d: New file. * testsuite/binutils-all/x86-64/lam-u48.s: Likewise. * testsuite/binutils-all/x86-64/lam-u57.d: Likewise. * testsuite/binutils-all/x86-64/lam-u57.s: Likewise. include/ * elf/common.h (GNU_PROPERTY_X86_FEATURE_1_LAM_U48): New. (GNU_PROPERTY_X86_FEATURE_1_LAM_U57): Likewise. ld/ * NEWS: Mention LAM_U48 and LAM_U57 support. * ld.texi: Document LAM_U48 and LAM_U57 support. * emulparams/cet.sh: Updated. * emulparams/elf_x86_64.sh: Source x86-64-lam.sh. * emulparams/x86-64-lam.sh: New file. * testsuite/ld-x86-64/property-x86-lam-u48-1a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-1b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-2.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-3a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-3b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-4.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-5.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48.s: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-1a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-1b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-2.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-3a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-3b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-4.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-5.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57.s: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run LAM tests. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 582add86d20..0cb006d6944 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2020-12-23 H.J. Lu + + * elf-linker-x86.h (elf_x86_cet_report): Renamed to ... + (elf_x86_prop_report): This. + (elf_linker_x86_params): Add lam_u48, lam_u57, lam_u48_report + and lam_u57_report. + * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Support + GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and + GNU_PROPERTY_X86_FEATURE_1_LAM_U57. + (_bfd_x86_elf_link_fixup_gnu_properties): Keep LAM features only + for 64-bit output. + 2020-12-18 H.J. Lu PR ld/27091 diff --git a/bfd/elf-linker-x86.h b/bfd/elf-linker-x86.h index 77e81960ab7..c0f8fab8bb7 100644 --- a/bfd/elf-linker-x86.h +++ b/bfd/elf-linker-x86.h @@ -18,14 +18,14 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -/* Missing IBT and SHSTK property report control. */ -enum elf_x86_cet_report +/* Missing IBT, SHSTK and LAM property report control. */ +enum elf_x86_prop_report { - cet_report_none = 0, /* Do nothing. */ - cet_report_warning = 1 << 0, /* Issue a warning. */ - cet_report_error = 1 << 1, /* Issue an error. */ - cet_report_ibt = 1 << 2, /* Report missing IBT property. */ - cet_report_shstk = 1 << 3 /* Report missing SHSTK property. */ + prop_report_none = 0, /* Do nothing. */ + prop_report_warning = 1 << 0, /* Issue a warning. */ + prop_report_error = 1 << 1, /* Issue an error. */ + prop_report_ibt = 1 << 2, /* Report missing IBT property. */ + prop_report_shstk = 1 << 3 /* Report missing SHSTK property. */ }; /* Used to pass x86-specific linker options from ld to bfd. */ @@ -43,6 +43,12 @@ struct elf_linker_x86_params /* TRUE if GNU_PROPERTY_X86_FEATURE_1_SHSTK should be generated. */ unsigned int shstk: 1; + /* TRUE if GNU_PROPERTY_X86_FEATURE_1_LAM_U48 should be generated. */ + unsigned int lam_u48: 1; + + /* TRUE if GNU_PROPERTY_X86_FEATURE_1_LAM_U57 should be generated. */ + unsigned int lam_u57: 1; + /* TRUE if we shouldn't check relocation overflow. */ unsigned int no_reloc_overflow_check: 1; @@ -59,7 +65,13 @@ struct elf_linker_x86_params unsigned int isa_level; /* Report missing IBT and SHSTK properties. */ - enum elf_x86_cet_report cet_report; + enum elf_x86_prop_report cet_report; + + /* Report missing LAM_U48 property. */ + enum elf_x86_prop_report lam_u48_report; + + /* Report missing LAM_U57 property. */ + enum elf_x86_prop_report lam_u57_report; /* The 1-byte NOP for x86 call instruction. */ char call_nop_byte; diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 8246fe5bd1b..6c652d54ab0 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -2545,15 +2545,25 @@ _bfd_x86_elf_link_setup_gnu_properties if (htab->params->ibt) { features = GNU_PROPERTY_X86_FEATURE_1_IBT; - htab->params->cet_report &= ~cet_report_ibt; + htab->params->cet_report &= ~prop_report_ibt; } if (htab->params->shstk) { features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK; - htab->params->cet_report &= ~cet_report_shstk; + htab->params->cet_report &= ~prop_report_shstk; + } + if (!(htab->params->cet_report & (prop_report_ibt | prop_report_shstk))) + htab->params->cet_report = prop_report_none; + if (htab->params->lam_u48) + { + features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U48; + htab->params->lam_u48_report = prop_report_none; + } + if (htab->params->lam_u57) + { + features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57; + htab->params->lam_u57_report = prop_report_none; } - if (!(htab->params->cet_report & (cet_report_ibt | cet_report_shstk))) - htab->params->cet_report = cet_report_none; switch (htab->params->isa_level) { @@ -2581,8 +2591,10 @@ _bfd_x86_elf_link_setup_gnu_properties prop = NULL; if (features) { - /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and - GNU_PROPERTY_X86_FEATURE_1_SHSTK. */ + /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT, + GNU_PROPERTY_X86_FEATURE_1_SHSTK, + GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and + GNU_PROPERTY_X86_FEATURE_1_LAM_U57. */ prop = _bfd_elf_get_property (ebfd, GNU_PROPERTY_X86_FEATURE_1_AND, 4); @@ -2625,22 +2637,49 @@ _bfd_x86_elf_link_setup_gnu_properties } } - if (htab->params->cet_report) + if (htab->params->cet_report + || htab->params->lam_u48_report + || htab->params->lam_u57_report) { - /* Report missing IBT and SHSTK properties. */ + /* Report missing IBT, SHSTK and LAM properties. */ bfd *abfd; - const char *msg; + const char *warning_msg = _("%P: %pB: warning: missing %s\n"); + const char *error_msg = _("%X%P: %pB: error: missing %s\n"); + const char *cet_msg = NULL; + const char *lam_u48_msg = NULL; + const char *lam_u57_msg = NULL; + const char *missing; elf_property_list *p; bfd_boolean missing_ibt, missing_shstk; + bfd_boolean missing_lam_u48, missing_lam_u57; bfd_boolean check_ibt - = !!(htab->params->cet_report & cet_report_ibt); + = (htab->params->cet_report + && (htab->params->cet_report & prop_report_ibt)); bfd_boolean check_shstk - = !!(htab->params->cet_report & cet_report_shstk); + = (htab->params->cet_report + && (htab->params->cet_report & prop_report_shstk)); - if ((htab->params->cet_report & cet_report_warning)) - msg = _("%P: %pB: warning: missing %s\n"); - else - msg = _("%X%P: %pB: error: missing %s\n"); + if (htab->params->cet_report) + { + if ((htab->params->cet_report & prop_report_warning)) + cet_msg = warning_msg; + else + cet_msg = error_msg; + } + if (htab->params->lam_u48_report) + { + if ((htab->params->lam_u48_report & prop_report_warning)) + lam_u48_msg = warning_msg; + else + lam_u48_msg = error_msg; + } + if (htab->params->lam_u57_report) + { + if ((htab->params->lam_u57_report & prop_report_warning)) + lam_u57_msg = warning_msg; + else + lam_u57_msg = error_msg; + } for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next) if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED)) @@ -2652,23 +2691,38 @@ _bfd_x86_elf_link_setup_gnu_properties missing_ibt = check_ibt; missing_shstk = check_shstk; + missing_lam_u48 = !!lam_u48_msg; + missing_lam_u57 = !!lam_u57_msg; if (p) { missing_ibt &= !(p->property.u.number & GNU_PROPERTY_X86_FEATURE_1_IBT); missing_shstk &= !(p->property.u.number & GNU_PROPERTY_X86_FEATURE_1_SHSTK); + missing_lam_u48 &= !(p->property.u.number + & GNU_PROPERTY_X86_FEATURE_1_LAM_U48); + missing_lam_u57 &= !(p->property.u.number + & GNU_PROPERTY_X86_FEATURE_1_LAM_U57); } if (missing_ibt || missing_shstk) { - const char *missing; if (missing_ibt && missing_shstk) missing = _("IBT and SHSTK properties"); else if (missing_ibt) missing = _("IBT property"); else missing = _("SHSTK property"); - info->callbacks->einfo (msg, abfd, missing); + info->callbacks->einfo (cet_msg, abfd, missing); + } + if (missing_lam_u48) + { + missing = _("LAM_U48 property"); + info->callbacks->einfo (lam_u48_msg, abfd, missing); + } + if (missing_lam_u57) + { + missing = _("LAM_U57 property"); + info->callbacks->einfo (lam_u57_msg, abfd, missing); } } } @@ -3008,8 +3062,7 @@ _bfd_x86_elf_link_setup_gnu_properties void _bfd_x86_elf_link_fixup_gnu_properties - (struct bfd_link_info *info ATTRIBUTE_UNUSED, - elf_property_list **listp) + (struct bfd_link_info *info, elf_property_list **listp) { elf_property_list *p; @@ -3037,6 +3090,12 @@ _bfd_x86_elf_link_fixup_gnu_properties continue; } + /* Keep LAM features only for 64-bit output. */ + if (type == GNU_PROPERTY_X86_FEATURE_1_AND + && !ABI_64_P (info->output_bfd)) + p->property.u.number &= ~(GNU_PROPERTY_X86_FEATURE_1_LAM_U48 + | GNU_PROPERTY_X86_FEATURE_1_LAM_U57); + listp = &p->next; } else if (type > GNU_PROPERTY_HIPROC) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 885b4703484..298c28c7e67 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,16 @@ +2020-12-23 H.J. Lu + + * NEWS: Mention LAM_U48 and LAM_U57 support. + * elfedit.c (elf_x86_feature): Support lam_u48 and lam_u57. + (usage): Add lam_u48 and lam_u57. + * readelf.c (decode_x86_feature_1): Support LAM_U48 and LAM_U57. + * doc/binutils.texi: Update elfedit with lam_u48 and lam_u57 + support. + * testsuite/binutils-all/x86-64/lam-u48.d: New file. + * testsuite/binutils-all/x86-64/lam-u48.s: Likewise. + * testsuite/binutils-all/x86-64/lam-u57.d: Likewise. + * testsuite/binutils-all/x86-64/lam-u57.s: Likewise. + 2020-12-15 Vivek Das Mohapatra * readelf.c (get_dynamic_type): Handle DT_GNU_FLAGS_1. diff --git a/binutils/NEWS b/binutils/NEWS index a5a31959ffe..20b73f503dd 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* Update elfedit and readelf with LAM_U48 and LAM_U57 support. + * Nm has a new command line option: --ifunc-chars=CHARS. This specifies a string of one or two characters. The first character is used as the type character when displaying global ifunc symbols. The second character, if diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 671694f8111..0ed3548d95c 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -5117,7 +5117,8 @@ supported ELF OSABI are the same as @option{--input-osabi}. @item --enable-x86-feature=@var{feature} Set the @var{feature} bit in program property in @var{exec} or @var{dyn} ELF files with machine types of @var{i386} or @var{x86-64}. The -supported features are, @var{ibt} and @var{shstk}. +supported features are, @var{ibt}, @var{shstk}, @var{lam_u48} and +@var{lam_u57}. @item --disable-x86-feature=@var{feature} Clear the @var{feature} bit in program property in @var{exec} or diff --git a/binutils/elfedit.c b/binutils/elfedit.c index 55474ffbbce..dc2f722d386 100644 --- a/binutils/elfedit.c +++ b/binutils/elfedit.c @@ -260,6 +260,10 @@ elf_x86_feature (const char *feature, int enable) x86_feature = GNU_PROPERTY_X86_FEATURE_1_IBT; else if (strcasecmp (feature, "shstk") == 0) x86_feature = GNU_PROPERTY_X86_FEATURE_1_SHSTK; + else if (strcasecmp (feature, "lam_u48") == 0) + x86_feature = GNU_PROPERTY_X86_FEATURE_1_LAM_U48; + else if (strcasecmp (feature, "lam_u57") == 0) + x86_feature = GNU_PROPERTY_X86_FEATURE_1_LAM_U57; else { error (_("Unknown x86 feature: %s\n"), feature); @@ -920,9 +924,9 @@ usage (FILE *stream, int exit_status) osabi, osabi); #ifdef HAVE_MMAP fprintf (stream, _("\ - --enable-x86-feature [ibt|shstk]\n\ + --enable-x86-feature [ibt|shstk|lam_u48|lam_u57]\n\ Enable x86 feature\n\ - --disable-x86-feature [ibt|shstk]\n\ + --disable-x86-feature [ibt|shstk|lam_u48|lam_u57]\n\ Disable x86 feature\n")); #endif fprintf (stream, _("\ diff --git a/binutils/readelf.c b/binutils/readelf.c index 22354ba951b..46fd87a974a 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -18748,6 +18748,12 @@ decode_x86_feature_1 (unsigned int bitmask) case GNU_PROPERTY_X86_FEATURE_1_SHSTK: printf ("SHSTK"); break; + case GNU_PROPERTY_X86_FEATURE_1_LAM_U48: + printf ("LAM_U48"); + break; + case GNU_PROPERTY_X86_FEATURE_1_LAM_U57: + printf ("LAM_U57"); + break; default: printf (_(""), bit); break; diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u48.d b/binutils/testsuite/binutils-all/x86-64/lam-u48.d new file mode 100644 index 00000000000..92d7d8175aa --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/lam-u48.d @@ -0,0 +1,12 @@ +#PROG: objcopy +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#objcopy: +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U48 + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: + x86 feature used: x86 diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u48.s b/binutils/testsuite/binutils-all/x86-64/lam-u48.s new file mode 100644 index 00000000000..52db75f86f9 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/lam-u48.s @@ -0,0 +1,27 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +2: .long 0xc0000002 /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x4 +4: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +5: diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u57.d b/binutils/testsuite/binutils-all/x86-64/lam-u57.d new file mode 100644 index 00000000000..c922075e983 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/lam-u57.d @@ -0,0 +1,12 @@ +#PROG: objcopy +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#objcopy: +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U57 + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: + x86 feature used: x86 diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u57.s b/binutils/testsuite/binutils-all/x86-64/lam-u57.s new file mode 100644 index 00000000000..d53098d9927 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/lam-u57.s @@ -0,0 +1,27 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +2: .long 0xc0000002 /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x8 +4: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +5: diff --git a/include/ChangeLog b/include/ChangeLog index 933e7dab45d..976b36105e3 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2020-12-23 H.J. Lu + + * elf/common.h (GNU_PROPERTY_X86_FEATURE_1_LAM_U48): New. + (GNU_PROPERTY_X86_FEATURE_1_LAM_U57): Likewise. + 2020-12-18 Alan Modra * xtensa-isa-internal.h (xtisa_errno, xtisa_error_msg): Delete. diff --git a/include/elf/common.h b/include/elf/common.h index 4d3718a2f01..39e1a3f1676 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -842,6 +842,8 @@ #define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) #define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) +#define GNU_PROPERTY_X86_FEATURE_1_LAM_U48 (1U << 2) +#define GNU_PROPERTY_X86_FEATURE_1_LAM_U57 (1U << 3) #define GNU_PROPERTY_X86_FEATURE_2_X86 (1U << 0) #define GNU_PROPERTY_X86_FEATURE_2_X87 (1U << 1) diff --git a/ld/ChangeLog b/ld/ChangeLog index 05eaadad3b4..c34409c575f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,28 @@ +2020-12-23 H.J. Lu + + * NEWS: Mention LAM_U48 and LAM_U57 support. + * ld.texi: Document LAM_U48 and LAM_U57 support. + * emulparams/cet.sh: Updated. + * emulparams/elf_x86_64.sh: Source x86-64-lam.sh. + * emulparams/x86-64-lam.sh: New file. + * testsuite/ld-x86-64/property-x86-lam-u48-1a.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-1b.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-2.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-3a.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-3b.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-4.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48-5.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u48.s: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-1a.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-1b.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-2.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-3a.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-3b.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-4.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57-5.d: Likewise. + * testsuite/ld-x86-64/property-x86-lam-u57.s: Likewise. + * testsuite/ld-x86-64/x86-64.exp: Run LAM tests. + 2020-12-18 H.J. Lu PR ld/27082 diff --git a/ld/NEWS b/ld/NEWS index 1c3f9c156e4..a5c0d7a2f65 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -8,6 +8,19 @@ encountered. This option can be suppressed via the configure time switch: --enable-error-handling-script=no. +* Add -z lam-u48 to x86-64 ELF linker to generate LAM_U48 property. + +* Add -z lam-u57 to x86-64 ELF linker to enerate LAM_U57 property. + +* Add -z lam-u48-report=[none|warning|error] to report missing LAM_U48 + property. + +* Add -z lam-u57-report=[none|warning|error] to report missing LAM_U57 + property. + +* Add -z lam-report=[none|warning|error] to report missing LAM_U48 and + LAM_U57 properties. + * Add -z x86-64-{baseline|v[234]} to the x86 ELF linker to mark x86-64-{baseline|v[234]} ISA level as needed. diff --git a/ld/emulparams/cet.sh b/ld/emulparams/cet.sh index f9a83ec099b..d9e81df6954 100644 --- a/ld/emulparams/cet.sh +++ b/ld/emulparams/cet.sh @@ -19,15 +19,15 @@ PARSE_AND_LIST_ARGS_CASE_Z_CET=' else if (strncmp (optarg, "cet-report=", 11) == 0) { if (strcmp (optarg + 11, "none") == 0) - params.cet_report = cet_report_none; + params.cet_report = prop_report_none; else if (strcmp (optarg + 11, "warning") == 0) - params.cet_report = (cet_report_warning - | cet_report_ibt - | cet_report_shstk); + params.cet_report = (prop_report_warning + | prop_report_ibt + | prop_report_shstk); else if (strcmp (optarg + 11, "error") == 0) - params.cet_report = (cet_report_error - | cet_report_ibt - | cet_report_shstk); + params.cet_report = (prop_report_error + | prop_report_ibt + | prop_report_shstk); else einfo (_("%F%P: invalid option for -z cet-report=: %s\n"), optarg + 11); diff --git a/ld/emulparams/elf_x86_64.sh b/ld/emulparams/elf_x86_64.sh index 5996055e9ff..664ff189c04 100644 --- a/ld/emulparams/elf_x86_64.sh +++ b/ld/emulparams/elf_x86_64.sh @@ -5,6 +5,7 @@ source_sh ${srcdir}/emulparams/reloc_overflow.sh source_sh ${srcdir}/emulparams/call_nop.sh source_sh ${srcdir}/emulparams/cet.sh source_sh ${srcdir}/emulparams/x86-64-level.sh +source_sh ${srcdir}/emulparams/x86-64-lam.sh source_sh ${srcdir}/emulparams/static.sh SCRIPT_NAME=elf ELFSIZE=64 diff --git a/ld/emulparams/x86-64-lam.sh b/ld/emulparams/x86-64-lam.sh new file mode 100644 index 00000000000..40ddb053214 --- /dev/null +++ b/ld/emulparams/x86-64-lam.sh @@ -0,0 +1,69 @@ +PARSE_AND_LIST_OPTIONS_LAM=' + fprintf (file, _("\ + -z lam-u48 Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U48\n")); + fprintf (file, _("\ + -z lam-u48-report=[none|warning|error] (default: none)\n\ + Report missing LAM_U48 property\n")); + fprintf (file, _("\ + -z lam-u57 Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U57\n")); + fprintf (file, _("\ + -z lam-u57-report=[none|warning|error] (default: none)\n\ + Report missing LAM_U57 property\n")); + fprintf (file, _("\ + -z lam-report=[none|warning|error] (default: none)\n\ + Report missing LAM_U48 and LAM_U57 properties\n")); +' +PARSE_AND_LIST_ARGS_CASE_Z_LAM=' + else if (strcmp (optarg, "lam-u48") == 0) + params.lam_u48 = TRUE; + else if (strncmp (optarg, "lam-u48-report=", 15) == 0) + { + if (strcmp (optarg + 15, "none") == 0) + params.lam_u48_report = prop_report_none; + else if (strcmp (optarg + 15, "warning") == 0) + params.lam_u48_report = prop_report_warning; + else if (strcmp (optarg + 15, "error") == 0) + params.lam_u48_report = prop_report_error; + else + einfo (_("%F%P: invalid option for -z lam-u48-report=: %s\n"), + optarg + 15); + } + else if (strcmp (optarg, "lam-u57") == 0) + params.lam_u57 = TRUE; + else if (strncmp (optarg, "lam-u57-report=", 15) == 0) + { + if (strcmp (optarg + 15, "none") == 0) + params.lam_u57_report = prop_report_none; + else if (strcmp (optarg + 15, "warning") == 0) + params.lam_u57_report = prop_report_warning; + else if (strcmp (optarg + 15, "error") == 0) + params.lam_u57_report = prop_report_error; + else + einfo (_("%F%P: invalid option for -z lam-u57-report=: %s\n"), + optarg + 15); + } + else if (strncmp (optarg, "lam-report=", 11) == 0) + { + if (strcmp (optarg + 11, "none") == 0) + { + params.lam_u48_report = prop_report_none; + params.lam_u57_report = prop_report_none; + } + else if (strcmp (optarg + 11, "warning") == 0) + { + params.lam_u48_report = prop_report_warning; + params.lam_u57_report = prop_report_warning; + } + else if (strcmp (optarg + 11, "error") == 0) + { + params.lam_u48_report = prop_report_error; + params.lam_u57_report = prop_report_error; + } + else + einfo (_("%F%P: invalid option for -z lam-report=: %s\n"), + optarg + 11); + } +' + +PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_LAM" +PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_LAM" diff --git a/ld/ld.texi b/ld/ld.texi index 88b1687f1bb..98609a0af22 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -1316,6 +1316,50 @@ al which do not usually function correctly unless they are the sole instances of themselves. This behaviour can be overridden by the @code{dlmopen} caller and does not apply to certain loading mechanisms (such as audit libraries). +@item lam-u48 +Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U48 in .note.gnu.property section +to indicate compatibility with Intel LAM_U48. Supported for Linux/x86_64. + +@item lam-u57 +Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U57 in .note.gnu.property section +to indicate compatibility with Intel LAM_U57. Supported for Linux/x86_64. + +@item lam-u48-report=none +@itemx lam-u48-report=warning +@itemx lam-u48-report=error +Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U48 +property in input .note.gnu.property section. +@option{lam-u48-report=none}, which is the default, will make the +linker not report missing properties in input files. +@option{lam-u48-report=warning} will make the linker issue a warning for +missing properties in input files. @option{lam-u48-report=error} will +make the linker issue an error for missing properties in input files. +Supported for Linux/x86_64. + +@item lam-u57-report=none +@itemx lam-u57-report=warning +@itemx lam-u57-report=error +Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U57 +property in input .note.gnu.property section. +@option{lam-u57-report=none}, which is the default, will make the +linker not report missing properties in input files. +@option{lam-u57-report=warning} will make the linker issue a warning for +missing properties in input files. @option{lam-u57-report=error} will +make the linker issue an error for missing properties in input files. +Supported for Linux/x86_64. + +@item lam-report=none +@itemx lam-report=warning +@itemx lam-report=error +Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and +GNU_PROPERTY_X86_FEATURE_1_LAM_U57 properties in input .note.gnu.property +section. @option{lam-report=none}, which is the default, will make the +linker not report missing properties in input files. +@option{lam-report=warning} will make the linker issue a warning for +missing properties in input files. @option{lam-report=error} will make +the linker issue an error for missing properties in input files. +Supported for Linux/x86_64. + @item lazy When generating an executable or shared library, mark it to tell the dynamic linker to defer function call resolution to the point when diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d new file mode 100644 index 00000000000..5c46f6e5164 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d @@ -0,0 +1,11 @@ +#source: property-x86-empty.s +#source: property-x86-lam-u48.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d new file mode 100644 index 00000000000..ed083fbc96e --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d @@ -0,0 +1,11 @@ +#source: property-x86-lam-u48.s +#source: property-x86-empty.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d new file mode 100644 index 00000000000..7e9c50e60be --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d @@ -0,0 +1,11 @@ +#source: property-x86-lam-u48.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U48 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d new file mode 100644 index 00000000000..6e9194a6104 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d @@ -0,0 +1,12 @@ +#source: property-x86-3.s +#source: property-x86-lam-u48.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, , + x86 feature used: x86 + x86 ISA used: x86-64-v2, x86-64-v4, , diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d new file mode 100644 index 00000000000..154175111b7 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d @@ -0,0 +1,12 @@ +#source: property-x86-lam-u48.s +#source: property-x86-3.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, , + x86 feature used: x86 + x86 ISA used: x86-64-v2, x86-64-v4, , diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d new file mode 100644 index 00000000000..82cd7e2be44 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d @@ -0,0 +1,11 @@ +#source: property-x86-empty.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 -z lam-u48 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U48 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d new file mode 100644 index 00000000000..755d0d56e57 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d @@ -0,0 +1,11 @@ +#source: start.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 -z lam-u48 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U48 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48.s b/ld/testsuite/ld-x86-64/property-x86-lam-u48.s new file mode 100644 index 00000000000..52db75f86f9 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48.s @@ -0,0 +1,27 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +2: .long 0xc0000002 /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x4 +4: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +5: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d new file mode 100644 index 00000000000..e1c237c261d --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d @@ -0,0 +1,11 @@ +#source: property-x86-empty.s +#source: property-x86-lam-u57.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d new file mode 100644 index 00000000000..26eca4a9b36 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d @@ -0,0 +1,11 @@ +#source: property-x86-lam-u57.s +#source: property-x86-empty.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d new file mode 100644 index 00000000000..1f1c86acc10 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d @@ -0,0 +1,11 @@ +#source: property-x86-lam-u57.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U57 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d new file mode 100644 index 00000000000..fb6289a5198 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d @@ -0,0 +1,12 @@ +#source: property-x86-3.s +#source: property-x86-lam-u57.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, , + x86 feature used: x86 + x86 ISA used: x86-64-v2, x86-64-v4, , diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d new file mode 100644 index 00000000000..f33818dfafe --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d @@ -0,0 +1,12 @@ +#source: property-x86-lam-u57.s +#source: property-x86-3.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, , + x86 feature used: x86 + x86 ISA used: x86-64-v2, x86-64-v4, , diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d new file mode 100644 index 00000000000..9f51f89d052 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d @@ -0,0 +1,11 @@ +#source: property-x86-empty.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 -z lam-u57 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U57 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d new file mode 100644 index 00000000000..d0b69e67e27 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d @@ -0,0 +1,11 @@ +#source: start.s +#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes +#ld: -r -melf_x86_64 -z lam-u57 +#readelf: -n + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 feature: LAM_U57 + x86 feature used: x86 + x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57.s b/ld/testsuite/ld-x86-64/property-x86-lam-u57.s new file mode 100644 index 00000000000..d53098d9927 --- /dev/null +++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57.s @@ -0,0 +1,27 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +2: .long 0xc0000002 /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x8 +4: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +5: diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 41d385bf058..a548a325a3c 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -373,6 +373,20 @@ run_dump_test "property-x86-cet5b" run_dump_test "property-x86-cet5b-x32" run_dump_test "property-x86-cet6" run_dump_test "property-x86-cet6-x32" +run_dump_test "property-x86-lam-u48-1a" +run_dump_test "property-x86-lam-u48-1b" +run_dump_test "property-x86-lam-u48-2" +run_dump_test "property-x86-lam-u48-3a" +run_dump_test "property-x86-lam-u48-3b" +run_dump_test "property-x86-lam-u48-4" +run_dump_test "property-x86-lam-u48-5" +run_dump_test "property-x86-lam-u57-1a" +run_dump_test "property-x86-lam-u57-1b" +run_dump_test "property-x86-lam-u57-2" +run_dump_test "property-x86-lam-u57-3a" +run_dump_test "property-x86-lam-u57-3b" +run_dump_test "property-x86-lam-u57-4" +run_dump_test "property-x86-lam-u57-5" run_dump_test "pr21884" run_dump_test "pr22071" run_dump_test "pr22115-1a"