From 8ccee661574490ecf1a43dd76b70fae0cb2ed56f Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 12 Jun 2026 23:27:32 -0400 Subject: [PATCH] [stack-canaries] fixed platform behavior --- src/build_settings.cpp | 39 ++++++++++++++++++++++++++++----------- src/llvm_backend_proc.cpp | 4 +++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 19414fc89..6a1b296d0 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1909,16 +1909,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } break; } - } else if (metrics->os == TargetOs_linux) { - if (bc->reloc_mode == RelocMode_Default) { - bc->reloc_mode = RelocMode_PIC; - } - switch (metrics->arch) { - case TargetArch_arm64: - case TargetArch_amd64: - bc->no_plt = LLVM_VERSION_MAJOR >= 19; - break; - } } else if (metrics->os == TargetOs_openbsd) { // Always use PIC for OpenBSD: it defaults to PIE if (bc->reloc_mode == RelocMode_Default) { @@ -1947,10 +1937,37 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->metrics.target_triplet = str_lit("i686-linux-android"); bc->reloc_mode = RelocMode_PIC; break; - default: GB_PANIC("Unknown architecture for -subtarget:android"); } + } else if (metrics->os == TargetOs_linux) { + if (bc->reloc_mode == RelocMode_Default) { + bc->reloc_mode = RelocMode_PIC; + } + switch (metrics->arch) { + case TargetArch_arm64: + case TargetArch_amd64: + bc->no_plt = LLVM_VERSION_MAJOR >= 19; + break; + } + } + + if (metrics->os == TargetOs_windows || + metrics->os == TargetOs_darwin || + metrics->os == TargetOs_linux || + metrics->os == TargetOs_freebsd || + metrics->os == TargetOs_openbsd || + metrics->os == TargetOs_netbsd) { + if (bc->stack_protector == StackProtector_Default) { + bc->stack_protector = StackProtector_Ssp; + } + } else { + if (bc->stack_protector == StackProtector_Default) { + bc->stack_protector = StackProtector_None; + } else { + gb_printf_err("-stack-protector is not supported on this target\n"); + gb_exit(1); + } } if (bc->metrics.os == TargetOs_windows) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 738f763cf..7994ab4ba 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -161,13 +161,15 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } switch (build_context.stack_protector) { - case StackProtector_Default: case StackProtector_Ssp: lb_add_attribute_to_proc(m, p->value, "ssp"); + break; case StackProtector_SspReq: lb_add_attribute_to_proc(m, p->value, "sspreq"); + break; case StackProtector_SspStrong: lb_add_attribute_to_proc(m, p->value, "sspstrong"); + break; } if (build_context.disable_unwind) {