diff --git a/elf/cmdline.cc b/elf/cmdline.cc index c299b27126..00acb2139a 100644 --- a/elf/cmdline.cc +++ b/elf/cmdline.cc @@ -1064,6 +1064,12 @@ std::vector parse_nonpositional_args(Context &ctx) { ctx.arg.z_rewrite_endbr = true; } else if (read_z_flag("rodynamic")) { ctx.arg.z_rodynamic = true; + } else if (read_z_flag("x86-64-v2")) { + ctx.arg.z_x86_64_isa_level |= GNU_PROPERTY_X86_ISA_1_V2; + } else if (read_z_flag("x86-64-v3")) { + ctx.arg.z_x86_64_isa_level |= GNU_PROPERTY_X86_ISA_1_V3; + } else if (read_z_flag("x86-64-v4")) { + ctx.arg.z_x86_64_isa_level |= GNU_PROPERTY_X86_ISA_1_V4; } else if (read_flag("nmagic")) { ctx.arg.nmagic = true; } else if (read_flag("no-nmagic")) { diff --git a/elf/elf.h b/elf/elf.h index 43ce903c44..f1530fb93c 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -342,6 +342,12 @@ enum : u32 { GNU_PROPERTY_X86_FEATURE_1_IBT = 1, GNU_PROPERTY_X86_FEATURE_1_SHSTK = 2, GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002, + + GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0008002, + GNU_PROPERTY_X86_ISA_1_BASELINE = 1, + GNU_PROPERTY_X86_ISA_1_V2 = 2, + GNU_PROPERTY_X86_ISA_1_V3 = 4, + GNU_PROPERTY_X86_ISA_1_V4 = 8, }; enum : u32 { diff --git a/elf/mold.h b/elf/mold.h index 6556424183..7bb5f99e8f 100644 --- a/elf/mold.h +++ b/elf/mold.h @@ -1889,6 +1889,7 @@ struct Context { std::vector exclude_libs; std::vector filter; std::vector trace_symbol; + u32 z_x86_64_isa_level = 0; u64 image_base = 0x200000; u64 shuffle_sections_seed = 0; } arg; diff --git a/elf/output-chunks.cc b/elf/output-chunks.cc index a8290805a1..1e997a6e0d 100644 --- a/elf/output-chunks.cc +++ b/elf/output-chunks.cc @@ -2696,6 +2696,8 @@ void NotePropertySection::update_shdr(Context &ctx) { if (ctx.arg.z_shstk) properties[GNU_PROPERTY_X86_FEATURE_1_AND] |= GNU_PROPERTY_X86_FEATURE_1_SHSTK; + properties[GNU_PROPERTY_X86_ISA_1_NEEDED] |= ctx.arg.z_x86_64_isa_level; + std::erase_if(properties, [](std::pair kv) { return kv.second == 0; }); diff --git a/test/elf/x86_64_isa-level.sh b/test/elf/x86_64_isa-level.sh new file mode 100755 index 0000000000..97bccffe8b --- /dev/null +++ b/test/elf/x86_64_isa-level.sh @@ -0,0 +1,15 @@ +#!/bin/bash +. $(dirname $0)/common.inc + +cat <