[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.
This commit is contained in:
Martin Storsjö 2026-03-13 10:52:29 +02:00 committed by GitHub
parent c5847b113e
commit 887d2d4bf7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 2 deletions

View File

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

View File

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