Skip to content

Add std support to cygwin target #137621

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Mar 17, 2025
2 changes: 1 addition & 1 deletion compiler/rustc_target/src/spec/targets/x86_64_pc_cygwin.rs
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ pub(crate) fn target() -> Target {
description: Some("64-bit x86 Cygwin".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
std: Some(true),
},
}
}
1 change: 1 addition & 0 deletions library/std/build.rs
Original file line number Diff line number Diff line change
@@ -61,6 +61,7 @@ fn main() {
|| target_os == "zkvm"
|| target_os == "rtems"
|| target_os == "nuttx"
|| target_os == "cygwin"

// See src/bootstrap/src/core/build_steps/synthetic_targets.rs
|| env::var("RUSTC_BOOTSTRAP_SYNTHETIC_TARGET").is_ok()
102 changes: 102 additions & 0 deletions library/std/src/os/cygwin/fs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#![stable(feature = "metadata_ext", since = "1.1.0")]
use crate::fs::Metadata;
use crate::sys_common::AsInner;
/// OS-specific extensions to [`fs::Metadata`].
///
/// [`fs::Metadata`]: crate::fs::Metadata
#[stable(feature = "metadata_ext", since = "1.1.0")]
pub trait MetadataExt {
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_dev(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_ino(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_mode(&self) -> u32;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_nlink(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_uid(&self) -> u32;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_gid(&self) -> u32;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_rdev(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_size(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_atime(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_atime_nsec(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_mtime(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_mtime_nsec(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_ctime(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_ctime_nsec(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_blksize(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_blocks(&self) -> u64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_birthtime(&self) -> i64;
#[stable(feature = "metadata_ext2", since = "1.8.0")]
fn st_birthtime_nsec(&self) -> i64;
}
#[stable(feature = "metadata_ext", since = "1.1.0")]
impl MetadataExt for Metadata {
fn st_dev(&self) -> u64 {
self.as_inner().as_inner().st_dev as u64
}
fn st_ino(&self) -> u64 {
self.as_inner().as_inner().st_ino as u64
}
fn st_mode(&self) -> u32 {
self.as_inner().as_inner().st_mode as u32
}
fn st_nlink(&self) -> u64 {
self.as_inner().as_inner().st_nlink as u64
}
fn st_uid(&self) -> u32 {
self.as_inner().as_inner().st_uid as u32
}
fn st_gid(&self) -> u32 {
self.as_inner().as_inner().st_gid as u32
}
fn st_rdev(&self) -> u64 {
self.as_inner().as_inner().st_rdev as u64
}
fn st_size(&self) -> u64 {
self.as_inner().as_inner().st_size as u64
}
fn st_atime(&self) -> i64 {
self.as_inner().as_inner().st_atime as i64
}
fn st_atime_nsec(&self) -> i64 {
self.as_inner().as_inner().st_atime_nsec as i64
}
fn st_mtime(&self) -> i64 {
self.as_inner().as_inner().st_mtime as i64
}
fn st_mtime_nsec(&self) -> i64 {
self.as_inner().as_inner().st_mtime_nsec as i64
}
fn st_ctime(&self) -> i64 {
self.as_inner().as_inner().st_ctime as i64
}
fn st_ctime_nsec(&self) -> i64 {
self.as_inner().as_inner().st_ctime_nsec as i64
}
fn st_blksize(&self) -> u64 {
self.as_inner().as_inner().st_blksize as u64
}
fn st_blocks(&self) -> u64 {
self.as_inner().as_inner().st_blocks as u64
}
fn st_birthtime(&self) -> i64 {
self.as_inner().as_inner().st_birthtime as i64
}
fn st_birthtime_nsec(&self) -> i64 {
self.as_inner().as_inner().st_birthtime_nsec as i64
}
}
4 changes: 4 additions & 0 deletions library/std/src/os/cygwin/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//! Cygwin-specific definitions
#![stable(feature = "raw_ext", since = "1.1.0")]
pub mod fs;
pub(crate) mod raw;
4 changes: 4 additions & 0 deletions library/std/src/os/cygwin/raw.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//! Cygwin-specific raw type definitions.
#[stable(feature = "raw_ext", since = "1.1.0")]
pub use libc::{blkcnt_t, blksize_t, dev_t, ino_t, mode_t, nlink_t, off_t, pthread_t, time_t};
2 changes: 2 additions & 0 deletions library/std/src/os/mod.rs
Original file line number Diff line number Diff line change
@@ -125,6 +125,8 @@ pub mod windows;
pub mod aix;
#[cfg(target_os = "android")]
pub mod android;
#[cfg(target_os = "cygwin")]
pub mod cygwin;
#[cfg(target_os = "dragonfly")]
pub mod dragonfly;
#[cfg(target_os = "emscripten")]
2 changes: 2 additions & 0 deletions library/std/src/os/unix/mod.rs
Original file line number Diff line number Diff line change
@@ -41,6 +41,8 @@ mod platform {
pub use crate::os::aix::*;
#[cfg(target_os = "android")]
pub use crate::os::android::*;
#[cfg(target_os = "cygwin")]
pub use crate::os::cygwin::*;
#[cfg(target_vendor = "apple")]
pub use crate::os::darwin::*;
#[cfg(target_os = "dragonfly")]
2 changes: 2 additions & 0 deletions library/std/src/os/unix/net/datagram.rs
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
target_os = "illumos",
target_os = "haiku",
target_os = "nto",
target_os = "cygwin"
))]
use libc::MSG_NOSIGNAL;

@@ -37,6 +38,7 @@ use crate::{fmt, io};
target_os = "illumos",
target_os = "haiku",
target_os = "nto",
target_os = "cygwin"
)))]
const MSG_NOSIGNAL: core::ffi::c_int = 0x0;

2 changes: 2 additions & 0 deletions library/std/src/os/unix/net/mod.rs
Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@ mod tests;
target_os = "openbsd",
target_os = "nto",
target_vendor = "apple",
target_os = "cygwin"
))]
mod ucred;

@@ -44,6 +45,7 @@ pub use self::stream::*;
target_os = "openbsd",
target_os = "nto",
target_vendor = "apple",
target_os = "cygwin",
))]
#[unstable(feature = "peer_credentials_unix_socket", issue = "42839", reason = "unstable")]
pub use self::ucred::*;
2 changes: 2 additions & 0 deletions library/std/src/os/unix/net/stream.rs
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ use super::{SocketAncillary, recv_vectored_with_ancillary_from, send_vectored_wi
target_os = "openbsd",
target_os = "nto",
target_vendor = "apple",
target_os = "cygwin"
))]
use super::{UCred, peer_cred};
use crate::fmt;
@@ -231,6 +232,7 @@ impl UnixStream {
target_os = "openbsd",
target_os = "nto",
target_vendor = "apple",
target_os = "cygwin"
))]
pub fn peer_cred(&self) -> io::Result<UCred> {
peer_cred(self)
4 changes: 2 additions & 2 deletions library/std/src/os/unix/net/ucred.rs
Original file line number Diff line number Diff line change
@@ -33,10 +33,10 @@ pub(super) use self::impl_apple::peer_cred;
target_os = "nto"
))]
pub(super) use self::impl_bsd::peer_cred;
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(any(target_os = "android", target_os = "linux", target_os = "cygwin"))]
pub(super) use self::impl_linux::peer_cred;

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android", target_os = "cygwin"))]
mod impl_linux {
use libc::{SO_PEERCRED, SOL_SOCKET, c_void, getsockopt, socklen_t, ucred};

2 changes: 1 addition & 1 deletion library/std/src/random.rs
Original file line number Diff line number Diff line change
@@ -37,7 +37,7 @@ use crate::sys::random as sys;
/// Solaris | [`arc4random_buf`](https://docs.oracle.com/cd/E88353_01/html/E37843/arc4random-3c.html)
/// Vita | `arc4random_buf`
/// Hermit | `read_entropy`
/// Horizon | `getrandom` shim
/// Horizon, Cygwin | `getrandom`
/// AIX, Hurd, L4Re, QNX | `/dev/urandom`
/// Redox | `/scheme/rand`
/// RTEMS | [`arc4random_buf`](https://docs.rtems.org/branches/master/bsp-howto/getentropy.html)
11 changes: 10 additions & 1 deletion library/std/src/sys/fs/unix.rs
Original file line number Diff line number Diff line change
@@ -543,7 +543,12 @@ impl FileAttr {
SystemTime::new(self.stat.st_atim.tv_sec as i64, self.stat.st_atim.tv_nsec as i64)
}

#[cfg(any(target_os = "freebsd", target_os = "openbsd", target_vendor = "apple"))]
#[cfg(any(
target_os = "freebsd",
target_os = "openbsd",
target_vendor = "apple",
target_os = "cygwin",
))]
pub fn created(&self) -> io::Result<SystemTime> {
SystemTime::new(self.stat.st_birthtime as i64, self.stat.st_birthtime_nsec as i64)
}
@@ -553,6 +558,7 @@ impl FileAttr {
target_os = "openbsd",
target_os = "vita",
target_vendor = "apple",
target_os = "cygwin",
)))]
pub fn created(&self) -> io::Result<SystemTime> {
cfg_has_statx! {
@@ -960,6 +966,7 @@ impl DirEntry {

#[cfg(any(
target_os = "linux",
target_os = "cygwin",
target_os = "emscripten",
target_os = "android",
target_os = "solaris",
@@ -1220,6 +1227,7 @@ impl File {
target_os = "freebsd",
target_os = "fuchsia",
target_os = "linux",
target_os = "cygwin",
target_os = "android",
target_os = "netbsd",
target_os = "openbsd",
@@ -1234,6 +1242,7 @@ impl File {
target_os = "fuchsia",
target_os = "freebsd",
target_os = "linux",
target_os = "cygwin",
target_os = "netbsd",
target_os = "openbsd",
target_os = "nto",
3 changes: 2 additions & 1 deletion library/std/src/sys/net/connection/socket.rs
Original file line number Diff line number Diff line change
@@ -59,7 +59,8 @@ cfg_if::cfg_if! {
target_os = "dragonfly", target_os = "freebsd",
target_os = "openbsd", target_os = "netbsd",
target_os = "solaris", target_os = "illumos",
target_os = "haiku", target_os = "nto"))] {
target_os = "haiku", target_os = "nto",
target_os = "cygwin"))] {
use libc::MSG_NOSIGNAL;
} else {
const MSG_NOSIGNAL: c_int = 0x0;
14 changes: 14 additions & 0 deletions library/std/src/sys/net/connection/socket/unix.rs
Original file line number Diff line number Diff line change
@@ -81,6 +81,7 @@ impl Socket {
target_os = "linux",
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
target_os = "nto",
target_os = "solaris",
))] {
@@ -128,6 +129,7 @@ impl Socket {
target_os = "hurd",
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
target_os = "nto",
))] {
// Like above, set cloexec atomically
@@ -257,6 +259,7 @@ impl Socket {
target_os = "hurd",
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
))] {
unsafe {
let fd = cvt_r(|| libc::accept4(self.as_raw_fd(), storage, len, libc::SOCK_CLOEXEC))?;
@@ -421,6 +424,7 @@ impl Socket {
Ok(())
}

#[cfg(not(target_os = "cygwin"))]
pub fn set_linger(&self, linger: Option<Duration>) -> io::Result<()> {
let linger = libc::linger {
l_onoff: linger.is_some() as libc::c_int,
@@ -430,6 +434,16 @@ impl Socket {
setsockopt(self, libc::SOL_SOCKET, SO_LINGER, linger)
}

#[cfg(target_os = "cygwin")]
pub fn set_linger(&self, linger: Option<Duration>) -> io::Result<()> {
let linger = libc::linger {
l_onoff: linger.is_some() as libc::c_ushort,
l_linger: linger.unwrap_or_default().as_secs() as libc::c_ushort,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be a try_into().map_error(|_| libc::ERANGE)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's just an imitation of the code above, for other platforms. Other platforms also use as.

};

setsockopt(self, libc::SOL_SOCKET, SO_LINGER, linger)
}

pub fn linger(&self) -> io::Result<Option<Duration>> {
let val: libc::linger = getsockopt(self, libc::SOL_SOCKET, SO_LINGER)?;

1 change: 1 addition & 0 deletions library/std/src/sys/pal/unix/args.rs
Original file line number Diff line number Diff line change
@@ -100,6 +100,7 @@ impl DoubleEndedIterator for Args {
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
target_os = "solaris",
target_os = "illumos",
target_os = "emscripten",
11 changes: 11 additions & 0 deletions library/std/src/sys/pal/unix/env.rs
Original file line number Diff line number Diff line change
@@ -108,6 +108,17 @@ pub mod os {
pub const EXE_EXTENSION: &str = "";
}

#[cfg(target_os = "cygwin")]
pub mod os {
pub const FAMILY: &str = "unix";
pub const OS: &str = "cygwin";
pub const DLL_PREFIX: &str = "";
pub const DLL_SUFFIX: &str = ".dll";
pub const DLL_EXTENSION: &str = "dll";
pub const EXE_SUFFIX: &str = ".exe";
pub const EXE_EXTENSION: &str = "exe";
}

#[cfg(target_os = "android")]
pub mod os {
pub const FAMILY: &str = "unix";
4 changes: 4 additions & 0 deletions library/std/src/sys/pal/unix/fd.rs
Original file line number Diff line number Diff line change
@@ -47,6 +47,7 @@ const READ_LIMIT: usize = if cfg!(target_vendor = "apple") {
target_os = "netbsd",
target_os = "openbsd",
target_vendor = "apple",
target_os = "cygwin",
))]
const fn max_iov() -> usize {
libc::IOV_MAX as usize
@@ -74,6 +75,7 @@ const fn max_iov() -> usize {
target_os = "horizon",
target_os = "vita",
target_vendor = "apple",
target_os = "cygwin",
)))]
const fn max_iov() -> usize {
16 // The minimum value required by POSIX.
@@ -500,6 +502,7 @@ impl FileDesc {
target_os = "fuchsia",
target_os = "l4re",
target_os = "linux",
target_os = "cygwin",
target_os = "haiku",
target_os = "redox",
target_os = "vxworks",
@@ -522,6 +525,7 @@ impl FileDesc {
target_os = "fuchsia",
target_os = "l4re",
target_os = "linux",
target_os = "cygwin",
target_os = "haiku",
target_os = "redox",
target_os = "vxworks",
2 changes: 1 addition & 1 deletion library/std/src/sys/pal/unix/mod.rs
Original file line number Diff line number Diff line change
@@ -380,7 +380,7 @@ cfg_if::cfg_if! {
#[link(name = "pthread")]
#[link(name = "rt")]
unsafe extern "C" {}
} else if #[cfg(any(target_os = "dragonfly", target_os = "openbsd"))] {
} else if #[cfg(any(target_os = "dragonfly", target_os = "openbsd", target_os = "cygwin"))] {
#[link(name = "pthread")]
unsafe extern "C" {}
} else if #[cfg(target_os = "solaris")] {
9 changes: 8 additions & 1 deletion library/std/src/sys/pal/unix/os.rs
Original file line number Diff line number Diff line change
@@ -46,6 +46,7 @@ unsafe extern "C" {
any(
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
target_os = "android",
target_os = "redox",
target_os = "nuttx",
@@ -118,7 +119,12 @@ pub fn error_string(errno: i32) -> String {
unsafe extern "C" {
#[cfg_attr(
all(
any(target_os = "linux", target_os = "hurd", target_env = "newlib"),
any(
target_os = "linux",
target_os = "hurd",
target_env = "newlib",
target_os = "cygwin"
),
not(target_env = "ohos")
),
link_name = "__xpg_strerror_r"
@@ -395,6 +401,7 @@ pub fn current_exe() -> io::Result<PathBuf> {

#[cfg(any(
target_os = "linux",
target_os = "cygwin",
target_os = "hurd",
target_os = "android",
target_os = "nuttx",
1 change: 1 addition & 0 deletions library/std/src/sys/pal/unix/pipe.rs
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@ pub fn anon_pipe() -> io::Result<(AnonPipe, AnonPipe)> {
target_os = "linux",
target_os = "netbsd",
target_os = "openbsd",
target_os = "cygwin",
target_os = "redox"
))] {
unsafe {
3 changes: 2 additions & 1 deletion library/std/src/sys/pal/unix/process/process_unix.rs
Original file line number Diff line number Diff line change
@@ -1154,7 +1154,7 @@ fn signal_string(signal: i32) -> &'static str {
)
))]
libc::SIGSTKFLT => " (SIGSTKFLT)",
#[cfg(any(target_os = "linux", target_os = "nto"))]
#[cfg(any(target_os = "linux", target_os = "nto", target_os = "cygwin"))]
libc::SIGPWR => " (SIGPWR)",
#[cfg(any(
target_os = "freebsd",
@@ -1163,6 +1163,7 @@ fn signal_string(signal: i32) -> &'static str {
target_os = "dragonfly",
target_os = "nto",
target_vendor = "apple",
target_os = "cygwin",
))]
libc::SIGEMT => " (SIGEMT)",
#[cfg(any(
4 changes: 3 additions & 1 deletion library/std/src/sys/pal/unix/thread.rs
Original file line number Diff line number Diff line change
@@ -137,7 +137,8 @@ impl Thread {
target_os = "linux",
target_os = "freebsd",
target_os = "dragonfly",
target_os = "nuttx"
target_os = "nuttx",
target_os = "cygwin"
))]
pub fn set_name(name: &CStr) {
unsafe {
@@ -362,6 +363,7 @@ pub fn available_parallelism() -> io::Result<NonZero<usize>> {
target_os = "linux",
target_os = "aix",
target_vendor = "apple",
target_os = "cygwin",
))] {
#[allow(unused_assignments)]
#[allow(unused_mut)]
5 changes: 4 additions & 1 deletion library/std/src/sys/personality/gcc.rs
Original file line number Diff line number Diff line change
@@ -248,7 +248,10 @@ cfg_if::cfg_if! {
}

cfg_if::cfg_if! {
if #[cfg(all(windows, any(target_arch = "aarch64", target_arch = "x86_64"), target_env = "gnu"))] {
if #[cfg(any(
all(windows, any(target_arch = "aarch64", target_arch = "x86_64"), target_env = "gnu"),
target_os = "cygwin",
))] {
/// personality fn called by [Windows Structured Exception Handling][windows-eh]
///
/// On x86_64 and AArch64 MinGW targets, the unwinding mechanism is SEH,
File renamed without changes.
8 changes: 4 additions & 4 deletions library/std/src/sys/random/mod.rs
Original file line number Diff line number Diff line change
@@ -35,10 +35,10 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "hermit")] {
mod hermit;
pub use hermit::fill_bytes;
} else if #[cfg(target_os = "horizon")] {
// FIXME: add arc4random_buf to shim-3ds
mod horizon;
pub use horizon::fill_bytes;
} else if #[cfg(any(target_os = "horizon", target_os = "cygwin"))] {
// FIXME(horizon): add arc4random_buf to shim-3ds
mod getrandom;
pub use getrandom::fill_bytes;
} else if #[cfg(any(
target_os = "aix",
target_os = "hurd",
9 changes: 6 additions & 3 deletions library/unwind/src/libunwind.rs
Original file line number Diff line number Diff line change
@@ -27,10 +27,10 @@ pub type _Unwind_Trace_Fn =
#[cfg(target_arch = "x86")]
pub const unwinder_private_data_size: usize = 5;

#[cfg(all(target_arch = "x86_64", not(target_os = "windows")))]
#[cfg(all(target_arch = "x86_64", not(any(target_os = "windows", target_os = "cygwin"))))]
pub const unwinder_private_data_size: usize = 2;

#[cfg(all(target_arch = "x86_64", target_os = "windows"))]
#[cfg(all(target_arch = "x86_64", any(target_os = "windows", target_os = "cygwin")))]
pub const unwinder_private_data_size: usize = 6;

#[cfg(all(target_arch = "arm", not(target_vendor = "apple")))]
@@ -289,7 +289,10 @@ if #[cfg(all(target_vendor = "apple", not(target_os = "watchos"), target_arch =
} // cfg_if!

cfg_if::cfg_if! {
if #[cfg(all(windows, any(target_arch = "aarch64", target_arch = "x86_64"), target_env = "gnu"))] {
if #[cfg(any(
all(windows, any(target_arch = "aarch64", target_arch = "x86_64"), target_env = "gnu"),
target_os = "cygwin",
))] {
// We declare these as opaque types. This is fine since you just need to
// pass them to _GCC_specific_handler and forget about them.
pub enum EXCEPTION_RECORD {}
2 changes: 1 addition & 1 deletion src/doc/rustc/src/platform-support.md
Original file line number Diff line number Diff line change
@@ -406,7 +406,7 @@ target | std | host | notes
[`wasm64-unknown-unknown`](platform-support/wasm64-unknown-unknown.md) | ? | | WebAssembly
[`x86_64-apple-tvos`](platform-support/apple-tvos.md) | ✓ | | x86 64-bit tvOS
[`x86_64-apple-watchos-sim`](platform-support/apple-watchos.md) | ✓ | | x86 64-bit Apple WatchOS simulator
[`x86_64-pc-cygwin`](platform-support/x86_64-pc-cygwin.md) | ? | | 64-bit x86 Cygwin |
[`x86_64-pc-cygwin`](platform-support/x86_64-pc-cygwin.md) | | | 64-bit x86 Cygwin |
[`x86_64-pc-nto-qnx710`](platform-support/nto-qnx.md) | ✓ | | x86 64-bit QNX Neutrino 7.1 RTOS with default network stack (io-pkt) |
[`x86_64-pc-nto-qnx710_iosock`](platform-support/nto-qnx.md) | ✓ | | x86 64-bit QNX Neutrino 7.1 RTOS with new network stack (io-sock) |
[`x86_64-pc-nto-qnx800`](platform-support/nto-qnx.md) | ✓ | | x86 64-bit QNX Neutrino 8.0 RTOS |