authorgravatar for meme@users.noreply.github.commeme <meme@users.noreply.github.com> 2019-09-27 16:51:42-04:00
committergravatar for meme@users.noreply.github.commeme <meme@users.noreply.github.com> 2019-09-27 16:51:42-04:00
logf7bf61a98349c7d888e8808047912c482a2d2560
tree0298b394aa5f052a9a0c5ccb2eaf798dcf26c1f2
parent805f9b309bee2d1a6c4fa34f1bc2746a8e60c35f

support Android NDK and bionic


4 files changed, 46 insertions(+), 13 deletions(-)

lib/std/c/linux.zig+12-2
......@@ -1,9 +1,19 @@
1const builtin = @import("builtin");
12const std = @import("../std.zig");
23const maxInt = std.math.maxInt;
34usingnamespace std.c;
45
5extern "c" fn __errno_location() *c_int;
6pub const _errno = __errno_location;
6pub 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
818pub const MAP_FAILED = @intToPtr(*c_void, maxInt(usize));
919
src/link.cpp+27-9
......@@ -1653,6 +1653,10 @@ 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
......@@ -1660,8 +1664,14 @@ static void construct_linker_job_elf(LinkJob *lj) {
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+6-2
......@@ -1590,10 +1590,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {
15901590
15911591bool 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
1597bool target_requires_pie(const ZigTarget *target) {
1598 return target_is_android(target);
1599}
1600
15971601bool 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
18781882bool 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+1
......@@ -182,6 +182,7 @@ const char *target_libc_generic_name(const ZigTarget *target);
182182bool target_is_libc_lib_name(const ZigTarget *target, const char *name);
183183bool target_supports_fpic(const ZigTarget *target);
184184bool target_requires_pic(const ZigTarget *target, bool linking_libc);
185bool target_requires_pie(const ZigTarget *target);
185186bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);
186187bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);
187188bool target_is_glibc(const ZigTarget *target);