Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -3319,8 +3319,12 @@ if (SanArgs.linkCXXRuntimes()) StaticRuntimes.push_back("ubsan_standalone_cxx"); } - if (SanArgs.needsSafeStackRt()) - StaticRuntimes.push_back("safestack"); + if (SanArgs.needsSafeStackRt()) { + if (Args.hasFlag(options::OPT_mseparate_stack_seg, options::OPT_mno_separate_stack_seg, false)) + StaticRuntimes.push_back("safestacksepseg"); + else + StaticRuntimes.push_back("safestack"); + } if (SanArgs.needsCfiRt()) StaticRuntimes.push_back("cfi"); if (SanArgs.needsCfiDiagRt()) { Index: test/Driver/sanitizer-ld.c =================================================================== --- test/Driver/sanitizer-ld.c +++ test/Driver/sanitizer-ld.c @@ -420,6 +420,17 @@ // CHECK-SAFESTACK-LINUX: "-lpthread" // CHECK-SAFESTACK-LINUX: "-ldl" +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux -fuse-ld=ld -fsanitize=safe-stack \ +// RUN: -mseparate-stack-seg --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-SAFESTACKMPX-LINUX %s +// +// CHECK-SAFESTACKMPX-LINUX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-SAFESTACKMPX-LINUX-NOT: "-lc" +// CHECK-SAFESTACKMPX-LINUX: libclang_rt.safestacksepseg-x86_64.a" +// CHECK-SAFESTACKMPX-LINUX: "-lpthread" +// CHECK-SAFESTACKMPX-LINUX: "-ldl" + // RUN: %clang -fsanitize=cfi -fsanitize-stats %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-unknown-linux -fuse-ld=ld \ // RUN: --sysroot=%S/Inputs/basic_linux_tree \