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.
This commit is contained in:
H.J. Lu 2020-12-23 13:00:39 -08:00
parent 5cc0917c38
commit 279d901e5a
37 changed files with 609 additions and 37 deletions

View file

@ -1,3 +1,15 @@
2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
* 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 <hongjiu.lu@intel.com> 2020-12-18 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27091 PR ld/27091

View file

@ -18,14 +18,14 @@
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */ MA 02110-1301, USA. */
/* Missing IBT and SHSTK property report control. */ /* Missing IBT, SHSTK and LAM property report control. */
enum elf_x86_cet_report enum elf_x86_prop_report
{ {
cet_report_none = 0, /* Do nothing. */ prop_report_none = 0, /* Do nothing. */
cet_report_warning = 1 << 0, /* Issue a warning. */ prop_report_warning = 1 << 0, /* Issue a warning. */
cet_report_error = 1 << 1, /* Issue an error. */ prop_report_error = 1 << 1, /* Issue an error. */
cet_report_ibt = 1 << 2, /* Report missing IBT property. */ prop_report_ibt = 1 << 2, /* Report missing IBT property. */
cet_report_shstk = 1 << 3 /* Report missing SHSTK property. */ prop_report_shstk = 1 << 3 /* Report missing SHSTK property. */
}; };
/* Used to pass x86-specific linker options from ld to bfd. */ /* 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. */ /* TRUE if GNU_PROPERTY_X86_FEATURE_1_SHSTK should be generated. */
unsigned int shstk: 1; 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. */ /* TRUE if we shouldn't check relocation overflow. */
unsigned int no_reloc_overflow_check: 1; unsigned int no_reloc_overflow_check: 1;
@ -59,7 +65,13 @@ struct elf_linker_x86_params
unsigned int isa_level; unsigned int isa_level;
/* Report missing IBT and SHSTK properties. */ /* 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. */ /* The 1-byte NOP for x86 call instruction. */
char call_nop_byte; char call_nop_byte;

View file

@ -2545,15 +2545,25 @@ _bfd_x86_elf_link_setup_gnu_properties
if (htab->params->ibt) if (htab->params->ibt)
{ {
features = GNU_PROPERTY_X86_FEATURE_1_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) if (htab->params->shstk)
{ {
features |= GNU_PROPERTY_X86_FEATURE_1_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) switch (htab->params->isa_level)
{ {
@ -2581,8 +2591,10 @@ _bfd_x86_elf_link_setup_gnu_properties
prop = NULL; prop = NULL;
if (features) if (features)
{ {
/* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT,
GNU_PROPERTY_X86_FEATURE_1_SHSTK. */ 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, prop = _bfd_elf_get_property (ebfd,
GNU_PROPERTY_X86_FEATURE_1_AND, GNU_PROPERTY_X86_FEATURE_1_AND,
4); 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; 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; elf_property_list *p;
bfd_boolean missing_ibt, missing_shstk; bfd_boolean missing_ibt, missing_shstk;
bfd_boolean missing_lam_u48, missing_lam_u57;
bfd_boolean check_ibt 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 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)) if (htab->params->cet_report)
msg = _("%P: %pB: warning: missing %s\n"); {
else if ((htab->params->cet_report & prop_report_warning))
msg = _("%X%P: %pB: error: missing %s\n"); 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) for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED)) 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_ibt = check_ibt;
missing_shstk = check_shstk; missing_shstk = check_shstk;
missing_lam_u48 = !!lam_u48_msg;
missing_lam_u57 = !!lam_u57_msg;
if (p) if (p)
{ {
missing_ibt &= !(p->property.u.number missing_ibt &= !(p->property.u.number
& GNU_PROPERTY_X86_FEATURE_1_IBT); & GNU_PROPERTY_X86_FEATURE_1_IBT);
missing_shstk &= !(p->property.u.number missing_shstk &= !(p->property.u.number
& GNU_PROPERTY_X86_FEATURE_1_SHSTK); & 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) if (missing_ibt || missing_shstk)
{ {
const char *missing;
if (missing_ibt && missing_shstk) if (missing_ibt && missing_shstk)
missing = _("IBT and SHSTK properties"); missing = _("IBT and SHSTK properties");
else if (missing_ibt) else if (missing_ibt)
missing = _("IBT property"); missing = _("IBT property");
else else
missing = _("SHSTK property"); 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 void
_bfd_x86_elf_link_fixup_gnu_properties _bfd_x86_elf_link_fixup_gnu_properties
(struct bfd_link_info *info ATTRIBUTE_UNUSED, (struct bfd_link_info *info, elf_property_list **listp)
elf_property_list **listp)
{ {
elf_property_list *p; elf_property_list *p;
@ -3037,6 +3090,12 @@ _bfd_x86_elf_link_fixup_gnu_properties
continue; 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; listp = &p->next;
} }
else if (type > GNU_PROPERTY_HIPROC) else if (type > GNU_PROPERTY_HIPROC)

View file

@ -1,3 +1,16 @@
2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
* 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 <vivek@collabora.com> 2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
* readelf.c (get_dynamic_type): Handle DT_GNU_FLAGS_1. * readelf.c (get_dynamic_type): Handle DT_GNU_FLAGS_1.

View file

@ -1,5 +1,7 @@
-*- text -*- -*- 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 * 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 string of one or two characters. The first character is used as the type
character when displaying global ifunc symbols. The second character, if character when displaying global ifunc symbols. The second character, if

View file

@ -5117,7 +5117,8 @@ supported ELF OSABI are the same as @option{--input-osabi}.
@item --enable-x86-feature=@var{feature} @item --enable-x86-feature=@var{feature}
Set the @var{feature} bit in program property in @var{exec} or @var{dyn} 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 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} @item --disable-x86-feature=@var{feature}
Clear the @var{feature} bit in program property in @var{exec} or Clear the @var{feature} bit in program property in @var{exec} or

View file

@ -260,6 +260,10 @@ elf_x86_feature (const char *feature, int enable)
x86_feature = GNU_PROPERTY_X86_FEATURE_1_IBT; x86_feature = GNU_PROPERTY_X86_FEATURE_1_IBT;
else if (strcasecmp (feature, "shstk") == 0) else if (strcasecmp (feature, "shstk") == 0)
x86_feature = GNU_PROPERTY_X86_FEATURE_1_SHSTK; 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 else
{ {
error (_("Unknown x86 feature: %s\n"), feature); error (_("Unknown x86 feature: %s\n"), feature);
@ -920,9 +924,9 @@ usage (FILE *stream, int exit_status)
osabi, osabi); osabi, osabi);
#ifdef HAVE_MMAP #ifdef HAVE_MMAP
fprintf (stream, _("\ fprintf (stream, _("\
--enable-x86-feature [ibt|shstk]\n\ --enable-x86-feature [ibt|shstk|lam_u48|lam_u57]\n\
Enable x86 feature\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")); Disable x86 feature\n"));
#endif #endif
fprintf (stream, _("\ fprintf (stream, _("\

View file

@ -18748,6 +18748,12 @@ decode_x86_feature_1 (unsigned int bitmask)
case GNU_PROPERTY_X86_FEATURE_1_SHSTK: case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
printf ("SHSTK"); printf ("SHSTK");
break; 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: default:
printf (_("<unknown: %x>"), bit); printf (_("<unknown: %x>"), bit);
break; break;

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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:

View file

@ -1,3 +1,8 @@
2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
* elf/common.h (GNU_PROPERTY_X86_FEATURE_1_LAM_U48): New.
(GNU_PROPERTY_X86_FEATURE_1_LAM_U57): Likewise.
2020-12-18 Alan Modra <amodra@gmail.com> 2020-12-18 Alan Modra <amodra@gmail.com>
* xtensa-isa-internal.h (xtisa_errno, xtisa_error_msg): Delete. * xtensa-isa-internal.h (xtisa_errno, xtisa_error_msg): Delete.

View file

@ -842,6 +842,8 @@
#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) #define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0)
#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) #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_X86 (1U << 0)
#define GNU_PROPERTY_X86_FEATURE_2_X87 (1U << 1) #define GNU_PROPERTY_X86_FEATURE_2_X87 (1U << 1)

View file

@ -1,3 +1,28 @@
2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
* 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 <hongjiu.lu@intel.com> 2020-12-18 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27082 PR ld/27082

13
ld/NEWS
View file

@ -8,6 +8,19 @@
encountered. This option can be suppressed via the configure time encountered. This option can be suppressed via the configure time
switch: --enable-error-handling-script=no. 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 * Add -z x86-64-{baseline|v[234]} to the x86 ELF linker to mark
x86-64-{baseline|v[234]} ISA level as needed. x86-64-{baseline|v[234]} ISA level as needed.

View file

@ -19,15 +19,15 @@ PARSE_AND_LIST_ARGS_CASE_Z_CET='
else if (strncmp (optarg, "cet-report=", 11) == 0) else if (strncmp (optarg, "cet-report=", 11) == 0)
{ {
if (strcmp (optarg + 11, "none") == 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) else if (strcmp (optarg + 11, "warning") == 0)
params.cet_report = (cet_report_warning params.cet_report = (prop_report_warning
| cet_report_ibt | prop_report_ibt
| cet_report_shstk); | prop_report_shstk);
else if (strcmp (optarg + 11, "error") == 0) else if (strcmp (optarg + 11, "error") == 0)
params.cet_report = (cet_report_error params.cet_report = (prop_report_error
| cet_report_ibt | prop_report_ibt
| cet_report_shstk); | prop_report_shstk);
else else
einfo (_("%F%P: invalid option for -z cet-report=: %s\n"), einfo (_("%F%P: invalid option for -z cet-report=: %s\n"),
optarg + 11); optarg + 11);

View file

@ -5,6 +5,7 @@ source_sh ${srcdir}/emulparams/reloc_overflow.sh
source_sh ${srcdir}/emulparams/call_nop.sh source_sh ${srcdir}/emulparams/call_nop.sh
source_sh ${srcdir}/emulparams/cet.sh source_sh ${srcdir}/emulparams/cet.sh
source_sh ${srcdir}/emulparams/x86-64-level.sh source_sh ${srcdir}/emulparams/x86-64-level.sh
source_sh ${srcdir}/emulparams/x86-64-lam.sh
source_sh ${srcdir}/emulparams/static.sh source_sh ${srcdir}/emulparams/static.sh
SCRIPT_NAME=elf SCRIPT_NAME=elf
ELFSIZE=64 ELFSIZE=64

View file

@ -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"

View file

@ -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 of themselves. This behaviour can be overridden by the @code{dlmopen} caller
and does not apply to certain loading mechanisms (such as audit libraries). 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 @item lazy
When generating an executable or shared library, mark it to tell the When generating an executable or shared library, mark it to tell the
dynamic linker to defer function call resolution to the point when dynamic linker to defer function call resolution to the point when

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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, <unknown: 10>, <unknown: 20>
x86 feature used: x86
x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>

View file

@ -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, <unknown: 10>, <unknown: 20>
x86 feature used: x86
x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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, <unknown: 10>, <unknown: 20>
x86 feature used: x86
x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>

View file

@ -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, <unknown: 10>, <unknown: 20>
x86 feature used: x86
x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -373,6 +373,20 @@ run_dump_test "property-x86-cet5b"
run_dump_test "property-x86-cet5b-x32" run_dump_test "property-x86-cet5b-x32"
run_dump_test "property-x86-cet6" run_dump_test "property-x86-cet6"
run_dump_test "property-x86-cet6-x32" 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 "pr21884"
run_dump_test "pr22071" run_dump_test "pr22071"
run_dump_test "pr22115-1a" run_dump_test "pr22115-1a"