From 887d2d4bf7380113b27f199f323eeee883f17191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Fri, 13 Mar 2026 10:52:29 +0200 Subject: [PATCH] [LLD] [ELF] Make -z gcs=always implicitly warn on missing GCS, like force-bti (#186203) This matches GNU ld, where gcs=always makes it implicitly warn about missing GCS flags, by matching the existing code pattern used for BTI and IBT. Also test that warnings can be printed for both missing BTI and GCS for the same object file. This fixes #186173. --- lld/ELF/Driver.cpp | 7 +++++++ lld/test/ELF/aarch64-feature-gcs.s | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index d7bfa7357d4e..fac8fa2db04d 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -3020,6 +3020,13 @@ static void readSecurityNotes(Ctx &ctx) { "GNU_PROPERTY_X86_FEATURE_1_IBT property"; features |= GNU_PROPERTY_X86_FEATURE_1_IBT; } + if (ctx.arg.zGcs == GcsPolicy::Always && + !(features & GNU_PROPERTY_AARCH64_FEATURE_1_GCS)) { + if (ctx.arg.zGcsReport == ReportPolicy::None) + Warn(ctx) << f + << ": -z gcs: file does not have " + "GNU_PROPERTY_AARCH64_FEATURE_1_GCS property"; + } if (ctx.arg.zPacPlt && !(hasValidPauthAbiCoreInfo || (features & GNU_PROPERTY_AARCH64_FEATURE_1_PAC))) { Warn(ctx) << f diff --git a/lld/test/ELF/aarch64-feature-gcs.s b/lld/test/ELF/aarch64-feature-gcs.s index 795e4c943c31..c19034c82c47 100644 --- a/lld/test/ELF/aarch64-feature-gcs.s +++ b/lld/test/ELF/aarch64-feature-gcs.s @@ -12,13 +12,22 @@ # RUN: ld.lld f1-s.o f2-s.o f3-s.o -o out --fatal-warnings # RUN: llvm-readelf -n out | FileCheck --check-prefix GCS %s -# RUN: ld.lld f1-s.o f2.o f3-s.o -o out.force -z gcs=always --fatal-warnings +# RUN: ld.lld f1-s.o f2.o f3-s.o -o out.force -z gcs=always 2>&1 | FileCheck --check-prefix=REPORT-GCS-WARN-F2 %s # RUN: llvm-readelf -n out.force | FileCheck --check-prefix GCS %s -# RUN: ld.lld f2-s.o f3.o --shared -o out.force.so -z gcs=never -z gcs=always --fatal-warnings +# RUN: ld.lld f2-s.o f3.o --shared -o out.force.so -z gcs=never -z gcs=always 2>&1 | FileCheck --check-prefix=REPORT-GCS-WARN-F3 %s # RUN: llvm-readelf -n out.force.so | FileCheck --check-prefix GCS %s +# RUN: ld.lld --shared f3.o -o out.force-bti -z gcs=always -z force-bti 2>&1 | FileCheck --check-prefix=REPORT-BTI-GCS-WARN-F3 %s # GCS: Properties: aarch64 feature: GCS +# REPORT-GCS-WARN-F2: warning: f2.o: -z gcs: file does not have GNU_PROPERTY_AARCH64_FEATURE_1_GCS property +# REPORT-GCS-WARN-F2-NOT: {{.}} +# REPORT-GCS-WARN-F3: warning: f3.o: -z gcs: file does not have GNU_PROPERTY_AARCH64_FEATURE_1_GCS property +# REPORT-GCS-WARN-F3-NOT: {{.}} +# REPORT-BTI-GCS-WARN-F3: warning: f3.o: -z force-bti: file does not have GNU_PROPERTY_AARCH64_FEATURE_1_BTI property +# REPORT-BTI-GCS-WARN-F3: warning: f3.o: -z gcs: file does not have GNU_PROPERTY_AARCH64_FEATURE_1_GCS property +# REPORT-BTI-GCS-WARN-F3-NOT: {{.}} + ## GCS should not be enabled if it's not enabled in at least one input. # RUN: ld.lld f1-s.o f2.o f3-s.o -o out.no --fatal-warnings