[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
Mon Mar 16 04:31:46 PDT 2026


https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/186778

Backport 887d2d4bf7380113b27f199f323eeee883f17191

Requested by: @mstorsjo

>From 4884fc6bb8ee1e5d5b95f122f4abe89a675ab15d 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