Skip to content

Commit 543e729

Browse files
authored
Merge pull request #3331 from meme/android-ndk
Support Android NDK
2 parents ce0e794 + 030abfa commit 543e729

File tree

4 files changed

+51
-16
lines changed

4 files changed

+51
-16
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: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,13 +1657,23 @@ static void construct_linker_job_elf(LinkJob *lj) {
16571657
soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);
16581658
}
16591659

1660+
if (target_requires_pie(g->zig_target) && g->out_type == OutTypeExe) {
1661+
lj->args.append("-pie");
1662+
}
1663+
16601664
lj->args.append("-o");
16611665
lj->args.append(buf_ptr(&g->output_file_path));
16621666

16631667
if (lj->link_in_crt) {
16641668
const char *crt1o;
16651669
if (g->zig_target->os == OsNetBSD) {
16661670
crt1o = "crt0.o";
1671+
} else if (target_is_android(g->zig_target)) {
1672+
if (g->have_dynamic_link) {
1673+
crt1o = "crtbegin_dynamic.o";
1674+
} else {
1675+
crt1o = "crtbegin_static.o";
1676+
}
16671677
} else if (!g->have_dynamic_link) {
16681678
crt1o = "crt1.o";
16691679
} else {
@@ -1771,22 +1781,28 @@ static void construct_linker_job_elf(LinkJob *lj) {
17711781
if (g->libc != nullptr) {
17721782
if (!g->have_dynamic_link) {
17731783
lj->args.append("--start-group");
1774-
lj->args.append("-lgcc");
1775-
lj->args.append("-lgcc_eh");
1784+
if (!target_is_android(g->zig_target)) {
1785+
lj->args.append("-lgcc");
1786+
lj->args.append("-lgcc_eh");
1787+
}
17761788
lj->args.append("-lc");
17771789
lj->args.append("-lm");
17781790
lj->args.append("--end-group");
17791791
} else {
1780-
lj->args.append("-lgcc");
1781-
lj->args.append("--as-needed");
1782-
lj->args.append("-lgcc_s");
1783-
lj->args.append("--no-as-needed");
1792+
if (!target_is_android(g->zig_target)) {
1793+
lj->args.append("-lgcc");
1794+
lj->args.append("--as-needed");
1795+
lj->args.append("-lgcc_s");
1796+
lj->args.append("--no-as-needed");
1797+
}
17841798
lj->args.append("-lc");
17851799
lj->args.append("-lm");
1786-
lj->args.append("-lgcc");
1787-
lj->args.append("--as-needed");
1788-
lj->args.append("-lgcc_s");
1789-
lj->args.append("--no-as-needed");
1800+
if (!target_is_android(g->zig_target)) {
1801+
lj->args.append("-lgcc");
1802+
lj->args.append("--as-needed");
1803+
lj->args.append("-lgcc_s");
1804+
lj->args.append("--no-as-needed");
1805+
}
17901806
}
17911807

17921808
if (g->zig_target->os == OsFreeBSD) {
@@ -1809,8 +1825,12 @@ static void construct_linker_job_elf(LinkJob *lj) {
18091825
}
18101826

18111827
// crt end
1812-
if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) {
1813-
lj->args.append(get_libc_crt_file(g, "crtn.o"));
1828+
if (lj->link_in_crt) {
1829+
if (target_is_android(g->zig_target)) {
1830+
lj->args.append(get_libc_crt_file(g, "crtend_android.o"));
1831+
} else if (target_libc_needs_crti_crtn(g->zig_target)) {
1832+
lj->args.append(get_libc_crt_file(g, "crtn.o"));
1833+
}
18141834
}
18151835

18161836
if (!g->zig_target->is_native) {

src/target.cpp

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

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

1601+
bool target_requires_pie(const ZigTarget *target) {
1602+
return target_is_android(target);
1603+
}
1604+
16011605
bool target_is_glibc(const ZigTarget *target) {
16021606
return target->os == OsLinux && target_abi_is_gnu(target->abi);
16031607
}
@@ -1880,7 +1884,7 @@ bool target_supports_libunwind(const ZigTarget *target) {
18801884
}
18811885

18821886
bool target_libc_needs_crti_crtn(const ZigTarget *target) {
1883-
if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64) {
1887+
if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64 || target_is_android(target)) {
18841888
return false;
18851889
}
18861890
return true;

src/target.hpp

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

0 commit comments

Comments
 (0)