Skip to content

Commit 163e9ce

Browse files
authored
Merge pull request #24629 from alexrp/android-requires-libc
`std.Target`: require libc for Android API levels prior to 29
2 parents 9b509da + 03facba commit 163e9ce

File tree

2 files changed

+56
-52
lines changed

2 files changed

+56
-52
lines changed

lib/std/Target.zig

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -697,57 +697,6 @@ pub const Os = struct {
697697
=> |field| @field(os.version_range, @tagName(field)).isAtLeast(ver),
698698
};
699699
}
700-
701-
/// On Darwin, we always link libSystem which contains libc.
702-
/// Similarly on FreeBSD and NetBSD we always link system libc
703-
/// since this is the stable syscall interface.
704-
pub fn requiresLibC(os: Os) bool {
705-
return switch (os.tag) {
706-
.aix,
707-
.driverkit,
708-
.macos,
709-
.ios,
710-
.tvos,
711-
.watchos,
712-
.visionos,
713-
.dragonfly,
714-
.openbsd,
715-
.haiku,
716-
.solaris,
717-
.illumos,
718-
.serenity,
719-
=> true,
720-
721-
.linux,
722-
.windows,
723-
.freebsd,
724-
.netbsd,
725-
.freestanding,
726-
.fuchsia,
727-
.ps3,
728-
.zos,
729-
.rtems,
730-
.cuda,
731-
.nvcl,
732-
.amdhsa,
733-
.ps4,
734-
.ps5,
735-
.mesa3d,
736-
.contiki,
737-
.amdpal,
738-
.hermit,
739-
.hurd,
740-
.wasi,
741-
.emscripten,
742-
.uefi,
743-
.opencl,
744-
.opengl,
745-
.vulkan,
746-
.plan9,
747-
.other,
748-
=> false,
749-
};
750-
}
751700
};
752701

753702
pub const aarch64 = @import("Target/aarch64.zig");
@@ -2055,6 +2004,61 @@ pub inline fn isWasiLibC(target: *const Target) bool {
20552004
return target.os.tag == .wasi and target.abi.isMusl();
20562005
}
20572006

2007+
/// Does this target require linking libc? This may be the case if the target has an unstable
2008+
/// syscall interface, for example.
2009+
pub fn requiresLibC(target: *const Target) bool {
2010+
return switch (target.os.tag) {
2011+
.aix,
2012+
.driverkit,
2013+
.macos,
2014+
.ios,
2015+
.tvos,
2016+
.watchos,
2017+
.visionos,
2018+
.dragonfly,
2019+
.openbsd,
2020+
.haiku,
2021+
.solaris,
2022+
.illumos,
2023+
.serenity,
2024+
=> true,
2025+
2026+
// Android API levels prior to 29 did not have native TLS support. For these API levels, TLS
2027+
// is implemented through calls to `__emutls_get_address`. We provide this function in
2028+
// compiler-rt, but it's implemented by way of `pthread_key_create` et al, so linking libc
2029+
// is required.
2030+
.linux => target.abi.isAndroid() and target.os.version_range.linux.android < 29,
2031+
2032+
.windows,
2033+
.freebsd,
2034+
.netbsd,
2035+
.freestanding,
2036+
.fuchsia,
2037+
.ps3,
2038+
.zos,
2039+
.rtems,
2040+
.cuda,
2041+
.nvcl,
2042+
.amdhsa,
2043+
.ps4,
2044+
.ps5,
2045+
.mesa3d,
2046+
.contiki,
2047+
.amdpal,
2048+
.hermit,
2049+
.hurd,
2050+
.wasi,
2051+
.emscripten,
2052+
.uefi,
2053+
.opencl,
2054+
.opengl,
2055+
.vulkan,
2056+
.plan9,
2057+
.other,
2058+
=> false,
2059+
};
2060+
}
2061+
20582062
pub const DynamicLinker = struct {
20592063
/// Contains the memory used to store the dynamic linker path. This field
20602064
/// should not be used directly. See `get` and `set`. This field exists so

src/target.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub fn cannotDynamicLink(target: *const std.Target) bool {
2020
/// Similarly on FreeBSD and NetBSD we always link system libc
2121
/// since this is the stable syscall interface.
2222
pub fn osRequiresLibC(target: *const std.Target) bool {
23-
return target.os.requiresLibC();
23+
return target.requiresLibC();
2424
}
2525

2626
pub fn libCNeedsLibUnwind(target: *const std.Target, link_mode: std.builtin.LinkMode) bool {

0 commit comments

Comments
 (0)