Create x86_64-unknown-linux-gnu{m,t}san target which enables {M,T}SAN by default

Similar like we've done it for `x86_64-unknown-linux-gnuasan`, in order
to distribute sanitizer instrumented standard libraries without
introducing new rustc flags, this adds a new dedicated target. With the
target, we can distribute the instrumented standard libraries through
a separate rustup component.
This commit is contained in:
Jakob Koschel
2026-02-17 13:53:43 +00:00
parent 0c68443b0a
commit de351814b3
11 changed files with 162 additions and 0 deletions
+2
View File
@@ -1815,6 +1815,8 @@ fn $module() {
("x86_64-pc-cygwin", x86_64_pc_cygwin),
("x86_64-unknown-linux-gnuasan", x86_64_unknown_linux_gnuasan),
("x86_64-unknown-linux-gnumsan", x86_64_unknown_linux_gnumsan),
("x86_64-unknown-linux-gnutsan", x86_64_unknown_linux_gnutsan),
}
/// Cow-Vec-Str: Cow<'static, [Cow<'static, str>]>
@@ -0,0 +1,16 @@
use crate::spec::{SanitizerSet, Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata = TargetMetadata {
description: Some(
"64-bit Linux (kernel 3.2+, glibc 2.17+) with MSAN enabled by default".into(),
),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base.supported_sanitizers = SanitizerSet::MEMORY;
base.default_sanitizers = SanitizerSet::MEMORY;
base
}
@@ -0,0 +1,16 @@
use crate::spec::{SanitizerSet, Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata = TargetMetadata {
description: Some(
"64-bit Linux (kernel 3.2+, glibc 2.17+) with TSAN enabled by default".into(),
),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base.supported_sanitizers = SanitizerSet::THREAD;
base.default_sanitizers = SanitizerSet::THREAD;
base
}
@@ -1552,6 +1552,8 @@ fn supported_sanitizers(
&["asan", "dfsan", "lsan", "msan", "safestack", "tsan", "rtsan"],
),
"x86_64-unknown-linux-gnuasan" => common_libs("linux", "x86_64", &["asan"]),
"x86_64-unknown-linux-gnumsan" => common_libs("linux", "x86_64", &["msan"]),
"x86_64-unknown-linux-gnutsan" => common_libs("linux", "x86_64", &["tsan"]),
"x86_64-unknown-linux-musl" => {
common_libs("linux", "x86_64", &["asan", "lsan", "msan", "tsan"])
}
+2
View File
@@ -37,6 +37,8 @@ pub struct Finder {
/// when the newly-bumped stage 0 compiler now knows about the formerly-missing targets.
const STAGE0_MISSING_TARGETS: &[&str] = &[
// just a dummy comment so the list doesn't get onelined
"x86_64-unknown-linux-gnumsan",
"x86_64-unknown-linux-gnutsan",
];
/// Minimum version threshold for libstdc++ required when using prebuilt LLVM
@@ -126,6 +126,8 @@ ENV TARGETS=$TARGETS,x86_64-unknown-uefi
ENV TARGETS=$TARGETS,riscv64gc-unknown-linux-musl
ENV TARGETS_SANITIZERS=x86_64-unknown-linux-gnuasan
ENV TARGETS_SANITIZERS=$TARGETS_SANITIZERS,x86_64-unknown-linux-gnumsan
ENV TARGETS_SANITIZERS=$TARGETS_SANITIZERS,x86_64-unknown-linux-gnutsan
# As per https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211
# we need asm in the search path for gcc-9 (for gnux32) but not in the search path of the
+2
View File
@@ -155,5 +155,7 @@
- [x86_64-unknown-linux-none](platform-support/x86_64-unknown-linux-none.md)
- [x86_64-unknown-none](platform-support/x86_64-unknown-none.md)
- [x86_64-unknown-linux-gnuasan](platform-support/x86_64-unknown-linux-gnuasan.md)
- [x86_64-unknown-linux-gnumsan](platform-support/x86_64-unknown-linux-gnumsan.md)
- [x86_64-unknown-linux-gnutsan](platform-support/x86_64-unknown-linux-gnutsan.md)
- [xtensa-\*-none-elf](platform-support/xtensa.md)
- [\*-nuttx-\*](platform-support/nuttx.md)
+2
View File
@@ -216,6 +216,8 @@ target | std | notes
[`x86_64-fortanix-unknown-sgx`](platform-support/x86_64-fortanix-unknown-sgx.md) | ✓ | [Fortanix ABI] for 64-bit Intel SGX
[`x86_64-linux-android`](platform-support/android.md) | ✓ | 64-bit x86 Android
[`x86_64-unknown-linux-gnuasan`](platform-support/x86_64-unknown-linux-gnuasan.md) | ✓ | 64-bit Linux (kernel 3.2+, glibc 2.17+) with ASAN enabled by default
[`x86_64-unknown-linux-gnumsan`](platform-support/x86_64-unknown-linux-gnumsan.md) | ✓ | 64-bit Linux (kernel 3.2+, glibc 2.17+) with MSAN enabled by default
[`x86_64-unknown-linux-gnutsan`](platform-support/x86_64-unknown-linux-gnutsan.md) | ✓ | 64-bit Linux (kernel 3.2+, glibc 2.17+) with TSAN enabled by default
[`x86_64-unknown-fuchsia`](platform-support/fuchsia.md) | ✓ | 64-bit x86 Fuchsia
`x86_64-unknown-linux-gnux32` | ✓ | 64-bit Linux (x32 ABI) (kernel 4.15+, glibc 2.27)
[`x86_64-unknown-none`](platform-support/x86_64-unknown-none.md) | * | Freestanding/bare-metal x86_64, softfloat
@@ -0,0 +1,56 @@
# `x86_64-unknown-linux-gnumsan`
**Tier: 2**
Target mirroring `x86_64-unknown-linux-gnu` with MemorySanitizer enabled by
default.
The goal of this target is to allow shipping MSAN-instrumented standard
libraries through rustup, enabling a fully instrumented binary without requiring
nightly features (build-std).
Once build-std stabilizes, this target is no longer needed and will be removed.
## Target maintainers
- [@jakos-sec](https://github.com/jakos-sec)
- [@1c3t3a](https://github.com/1c3t3a)
- [@rust-lang/project-exploit-mitigations][project-exploit-mitigations]
## Requirements
The target is for cross-compilation only. Host tools are not supported, since
there is no need to have the host tools instrumented with MSAN. std is fully
supported.
In all other aspects the target is equivalent to `x86_64-unknown-linux-gnu`.
## Building the target
The target can be built by enabling it for a rustc build:
```toml
[build]
target = ["x86_64-unknown-linux-gnumsan"]
```
## Building Rust programs
Rust programs can be compiled by adding this target via rustup:
```sh
$ rustup target add x86_64-unknown-linux-gnumsan
```
and then compiling with the target:
```sh
$ rustc foo.rs --target x86_64-unknown-linux-gnumsan
```
## Testing
Created binaries will run on Linux without any external requirements.
## Cross-compilation toolchains and C code
The target supports C code and should use the same toolchain target as
`x86_64-unknown-linux-gnu`.
@@ -0,0 +1,56 @@
# `x86_64-unknown-linux-gnutsan`
**Tier: 2**
Target mirroring `x86_64-unknown-linux-gnu` with ThreadSanitizer enabled by
default.
The goal of this target is to allow shipping TSAN-instrumented standard
libraries through rustup, enabling a fully instrumented binary without requiring
nightly features (build-std).
Once build-std stabilizes, this target is no longer needed and will be removed.
## Target maintainers
- [@jakos-sec](https://github.com/jakos-sec)
- [@1c3t3a](https://github.com/1c3t3a)
- [@rust-lang/project-exploit-mitigations][project-exploit-mitigations]
## Requirements
The target is for cross-compilation only. Host tools are not supported, since
there is no need to have the host tools instrumented with TSAN. std is fully
supported.
In all other aspects the target is equivalent to `x86_64-unknown-linux-gnu`.
## Building the target
The target can be built by enabling it for a rustc build:
```toml
[build]
target = ["x86_64-unknown-linux-gnutsan"]
```
## Building Rust programs
Rust programs can be compiled by adding this target via rustup:
```sh
$ rustup target add x86_64-unknown-linux-gnutsan
```
and then compiling with the target:
```sh
$ rustc foo.rs --target x86_64-unknown-linux-gnutsan
```
## Testing
Created binaries will run on Linux without any external requirements.
## Cross-compilation toolchains and C code
The target supports C code and should use the same toolchain target as
`x86_64-unknown-linux-gnu`.
@@ -709,6 +709,12 @@
//@ revisions: x86_64_unknown_linux_gnuasan
//@ [x86_64_unknown_linux_gnuasan] compile-flags: --target x86_64-unknown-linux-gnuasan
//@ [x86_64_unknown_linux_gnuasan] needs-llvm-components: x86
//@ revisions: x86_64_unknown_linux_gnumsan
//@ [x86_64_unknown_linux_gnumsan] compile-flags: --target x86_64-unknown-linux-gnumsan
//@ [x86_64_unknown_linux_gnumsan] needs-llvm-components: x86
//@ revisions: x86_64_unknown_linux_gnutsan
//@ [x86_64_unknown_linux_gnutsan] compile-flags: --target x86_64-unknown-linux-gnutsan
//@ [x86_64_unknown_linux_gnutsan] needs-llvm-components: x86
//@ revisions: x86_64_unknown_linux_musl
//@ [x86_64_unknown_linux_musl] compile-flags: --target x86_64-unknown-linux-musl
//@ [x86_64_unknown_linux_musl] needs-llvm-components: x86