Skip to content

Commit f7bf61a

Browse files
committed
support Android NDK and bionic
1 parent 805f9b3 commit f7bf61a

File tree

4 files changed

+46
-13
lines changed

4 files changed

+46
-13
lines changed

lib/std/c/linux.zig

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1+
const builtin = @import("builtin");
12
const std = @import("../std.zig");
23
const maxInt = std.math.maxInt;
34
usingnamespace std.c;
45

5-
extern "c" fn __errno_location() *c_int;
6-
pub const _errno = __errno_location;
6+
pub const _errno = switch (builtin.abi) {
7+
.android => struct {
8+
extern "c" var __errno: c_int;
9+
fn getErrno() *c_int {
10+
return &__errno;
11+
}
12+
}.getErrno,
13+
else => struct {
14+
extern "c" fn __errno_location() *c_int;
15+
}.__errno_location,
16+
};
717

818
pub const MAP_FAILED = @intToPtr(*c_void, maxInt(usize));
919

src/link.cpp

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,15 +1653,25 @@ static void construct_linker_job_elf(LinkJob *lj) {
16531653
soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);
16541654
}
16551655

1656+
if (target_requires_pie(g->zig_target) && !is_dyn_lib) {
1657+
lj->args.append("-pie");
1658+
}
1659+
16561660
lj->args.append("-o");
16571661
lj->args.append(buf_ptr(&g->output_file_path));
16581662

16591663
if (lj->link_in_crt) {
16601664
const char *crt1o;
16611665
if (g->zig_target->os == OsNetBSD) {
16621666
crt1o = "crt0.o";
1667+
} else if (target_is_android(g->zig_target)) {
1668+
crt1o = "crtbegin_dynamic.o";
16631669
} else if (!g->have_dynamic_link) {
1664-
crt1o = "crt1.o";
1670+
if (target_is_android(g->zig_target)) {
1671+
crt1o = "crtbegin.o";
1672+
} else {
1673+
crt1o = "crt1.o";
1674+
}
16651675
} else {
16661676
crt1o = "Scrt1.o";
16671677
}
@@ -1768,21 +1778,27 @@ static void construct_linker_job_elf(LinkJob *lj) {
17681778
if (!g->have_dynamic_link) {
17691779
lj->args.append("--start-group");
17701780
lj->args.append("-lgcc");
1771-
lj->args.append("-lgcc_eh");
1781+
if (!target_is_android(g->zig_target)) {
1782+
lj->args.append("-lgcc_eh");
1783+
}
17721784
lj->args.append("-lc");
17731785
lj->args.append("-lm");
17741786
lj->args.append("--end-group");
17751787
} else {
17761788
lj->args.append("-lgcc");
1777-
lj->args.append("--as-needed");
1778-
lj->args.append("-lgcc_s");
1779-
lj->args.append("--no-as-needed");
1789+
if (!target_is_android(g->zig_target)) {
1790+
lj->args.append("--as-needed");
1791+
lj->args.append("-lgcc_s");
1792+
lj->args.append("--no-as-needed");
1793+
}
17801794
lj->args.append("-lc");
17811795
lj->args.append("-lm");
17821796
lj->args.append("-lgcc");
1783-
lj->args.append("--as-needed");
1784-
lj->args.append("-lgcc_s");
1785-
lj->args.append("--no-as-needed");
1797+
if (!target_is_android(g->zig_target)) {
1798+
lj->args.append("--as-needed");
1799+
lj->args.append("-lgcc_s");
1800+
lj->args.append("--no-as-needed");
1801+
}
17861802
}
17871803

17881804
if (g->zig_target->os == OsFreeBSD) {
@@ -1805,7 +1821,9 @@ static void construct_linker_job_elf(LinkJob *lj) {
18051821
}
18061822

18071823
// crt end
1808-
if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) {
1824+
if (target_is_android(g->zig_target) && g->have_dynamic_link) {
1825+
lj->args.append(get_libc_crt_file(g, "crtend_android.o"));
1826+
} else if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) {
18091827
lj->args.append(get_libc_crt_file(g, "crtn.o"));
18101828
}
18111829

src/target.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,10 +1590,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {
15901590

15911591
bool target_requires_pic(const ZigTarget *target, bool linking_libc) {
15921592
// This function returns whether non-pic code is completely invalid on the given target.
1593-
return target->os == OsWindows || target->os == OsUefi || target_os_requires_libc(target->os) ||
1593+
return target_is_android(target) || target->os == OsWindows || target->os == OsUefi || target_os_requires_libc(target->os) ||
15941594
(linking_libc && target_is_glibc(target));
15951595
}
15961596

1597+
bool target_requires_pie(const ZigTarget *target) {
1598+
return target_is_android(target);
1599+
}
1600+
15971601
bool target_is_glibc(const ZigTarget *target) {
15981602
return target->os == OsLinux && target_abi_is_gnu(target->abi);
15991603
}
@@ -1876,7 +1880,7 @@ bool target_supports_libunwind(const ZigTarget *target) {
18761880
}
18771881

18781882
bool target_libc_needs_crti_crtn(const ZigTarget *target) {
1879-
if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64) {
1883+
if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64 || target_is_android(target)) {
18801884
return false;
18811885
}
18821886
return true;

src/target.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ const char *target_libc_generic_name(const ZigTarget *target);
182182
bool target_is_libc_lib_name(const ZigTarget *target, const char *name);
183183
bool target_supports_fpic(const ZigTarget *target);
184184
bool target_requires_pic(const ZigTarget *target, bool linking_libc);
185+
bool target_requires_pie(const ZigTarget *target);
185186
bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);
186187
bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);
187188
bool target_is_glibc(const ZigTarget *target);

0 commit comments

Comments
 (0)