[llvm-branch-commits] [lld] release/22.x: [LLD] [ELF] Make -z gcs=always implicitly warn on missing GCS, like force-bti (#186203) (PR #186778)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Mar 22 20:20:15 PDT 2026
https://github.com/dyung updated https://github.com/llvm/llvm-project/pull/186778
>From 8f8b53a0ecb3facf6414a6576929c6c9875d33b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin at martin.st>
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.
(cherry picked from commit 887d2d4bf7380113b27f199f323eeee883f17191)
---
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 9944cf2e73700..ee5a101713108 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 795e4c943c31a..c19034c82c47c 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
More information about the llvm-branch-commits
mailing list