authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-28 13:30:19-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-09-28 13:30:19-04:00
log543e729398c2ae2a6fbae8ab54ce0737d35004a0
tree0d2e1a26dd54da64ac6e8183212dfb7032b47b3a
parentce0e7940926ec4c4eeb95e2d5b67554de3863a56
parent030abfa0d2a95fb5cb9da61c59bb8332c65f8819
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #3331 from meme/android-ndk

Support Android NDK

4 files changed, 51 insertions(+), 16 deletions(-)

lib/std/c/linux.zig+12-2
...@@ -1,9 +1,19 @@...@@ -1,9 +1,19 @@
1const builtin = @import("builtin");
1const std = @import("../std.zig");2const std = @import("../std.zig");
2const maxInt = std.math.maxInt;3const maxInt = std.math.maxInt;
3usingnamespace std.c;4usingnamespace std.c;
45
5extern "c" fn __errno_location() *c_int;6pub const _errno = switch (builtin.abi) {
6pub const _errno = __errno_location;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
8pub const MAP_FAILED = @intToPtr(*c_void, maxInt(usize));18pub const MAP_FAILED = @intToPtr(*c_void, maxInt(usize));
919
src/link.cpp+32-12
...@@ -1657,6 +1657,10 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1657,6 +1657,10 @@ static void construct_linker_job_elf(LinkJob *lj) {
1657 soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);1657 soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);
1658 }1658 }
16591659
1660 if (target_requires_pie(g->zig_target) && g->out_type == OutTypeExe) {
1661 lj->args.append("-pie");
1662 }
1663
1660 lj->args.append("-o");1664 lj->args.append("-o");
1661 lj->args.append(buf_ptr(&g->output_file_path));1665 lj->args.append(buf_ptr(&g->output_file_path));
16621666
...@@ -1664,6 +1668,12 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1664,6 +1668,12 @@ static void construct_linker_job_elf(LinkJob *lj) {
1664 const char *crt1o;1668 const char *crt1o;
1665 if (g->zig_target->os == OsNetBSD) {1669 if (g->zig_target->os == OsNetBSD) {
1666 crt1o = "crt0.o";1670 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 }
1667 } else if (!g->have_dynamic_link) {1677 } else if (!g->have_dynamic_link) {
1668 crt1o = "crt1.o";1678 crt1o = "crt1.o";
1669 } else {1679 } else {
...@@ -1771,22 +1781,28 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1771,22 +1781,28 @@ static void construct_linker_job_elf(LinkJob *lj) {
1771 if (g->libc != nullptr) {1781 if (g->libc != nullptr) {
1772 if (!g->have_dynamic_link) {1782 if (!g->have_dynamic_link) {
1773 lj->args.append("--start-group");1783 lj->args.append("--start-group");
1774 lj->args.append("-lgcc");1784 if (!target_is_android(g->zig_target)) {
1775 lj->args.append("-lgcc_eh");1785 lj->args.append("-lgcc");
1786 lj->args.append("-lgcc_eh");
1787 }
1776 lj->args.append("-lc");1788 lj->args.append("-lc");
1777 lj->args.append("-lm");1789 lj->args.append("-lm");
1778 lj->args.append("--end-group");1790 lj->args.append("--end-group");
1779 } else {1791 } else {
1780 lj->args.append("-lgcc");1792 if (!target_is_android(g->zig_target)) {
1781 lj->args.append("--as-needed");1793 lj->args.append("-lgcc");
1782 lj->args.append("-lgcc_s");1794 lj->args.append("--as-needed");
1783 lj->args.append("--no-as-needed");1795 lj->args.append("-lgcc_s");
1796 lj->args.append("--no-as-needed");
1797 }
1784 lj->args.append("-lc");1798 lj->args.append("-lc");
1785 lj->args.append("-lm");1799 lj->args.append("-lm");
1786 lj->args.append("-lgcc");1800 if (!target_is_android(g->zig_target)) {
1787 lj->args.append("--as-needed");1801 lj->args.append("-lgcc");
1788 lj->args.append("-lgcc_s");1802 lj->args.append("--as-needed");
1789 lj->args.append("--no-as-needed");1803 lj->args.append("-lgcc_s");
1804 lj->args.append("--no-as-needed");
1805 }
1790 }1806 }
17911807
1792 if (g->zig_target->os == OsFreeBSD) {1808 if (g->zig_target->os == OsFreeBSD) {
...@@ -1809,8 +1825,12 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1809,8 +1825,12 @@ static void construct_linker_job_elf(LinkJob *lj) {
1809 }1825 }
18101826
1811 // crt end1827 // crt end
1812 if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) {1828 if (lj->link_in_crt) {
1813 lj->args.append(get_libc_crt_file(g, "crtn.o"));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 }
1814 }1834 }
18151835
1816 if (!g->zig_target->is_native) {1836 if (!g->zig_target->is_native) {
src/target.cpp+6-2
...@@ -1594,10 +1594,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {...@@ -1594,10 +1594,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {
15941594
1595bool target_requires_pic(const ZigTarget *target, bool linking_libc) {1595bool target_requires_pic(const ZigTarget *target, bool linking_libc) {
1596 // This function returns whether non-pic code is completely invalid on the given target.1596 // 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) ||
1598 (linking_libc && target_is_glibc(target));1598 (linking_libc && target_is_glibc(target));
1599}1599}
16001600
1601bool target_requires_pie(const ZigTarget *target) {
1602 return target_is_android(target);
1603}
1604
1601bool target_is_glibc(const ZigTarget *target) {1605bool target_is_glibc(const ZigTarget *target) {
1602 return target->os == OsLinux && target_abi_is_gnu(target->abi);1606 return target->os == OsLinux && target_abi_is_gnu(target->abi);
1603}1607}
...@@ -1880,7 +1884,7 @@ bool target_supports_libunwind(const ZigTarget *target) {...@@ -1880,7 +1884,7 @@ bool target_supports_libunwind(const ZigTarget *target) {
1880}1884}
18811885
1882bool target_libc_needs_crti_crtn(const ZigTarget *target) {1886bool 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)) {
1884 return false;1888 return false;
1885 }1889 }
1886 return true;1890 return true;
src/target.hpp+1
...@@ -183,6 +183,7 @@ const char *target_libc_generic_name(const ZigTarget *target);...@@ -183,6 +183,7 @@ const char *target_libc_generic_name(const ZigTarget *target);
183bool target_is_libc_lib_name(const ZigTarget *target, const char *name);183bool target_is_libc_lib_name(const ZigTarget *target, const char *name);
184bool target_supports_fpic(const ZigTarget *target);184bool target_supports_fpic(const ZigTarget *target);
185bool target_requires_pic(const ZigTarget *target, bool linking_libc);185bool target_requires_pic(const ZigTarget *target, bool linking_libc);
186bool target_requires_pie(const ZigTarget *target);
186bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);187bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);
187bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);188bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);
188bool target_is_glibc(const ZigTarget *target);189bool target_is_glibc(const ZigTarget *target);