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 @@...@@ -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+27-9
...@@ -1653,6 +1653,10 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1653,6 +1653,10 @@ static void construct_linker_job_elf(LinkJob *lj) {
1653 soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);1653 soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major);
1654 }1654 }
16551655
1656 if (target_requires_pie(g->zig_target) && !is_dyn_lib) {
1657 lj->args.append("-pie");
1658 }
1659
1656 lj->args.append("-o");1660 lj->args.append("-o");
1657 lj->args.append(buf_ptr(&g->output_file_path));1661 lj->args.append(buf_ptr(&g->output_file_path));
16581662
...@@ -1660,8 +1664,14 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1660,8 +1664,14 @@ static void construct_linker_job_elf(LinkJob *lj) {
1660 const char *crt1o;1664 const char *crt1o;
1661 if (g->zig_target->os == OsNetBSD) {1665 if (g->zig_target->os == OsNetBSD) {
1662 crt1o = "crt0.o";1666 crt1o = "crt0.o";
1667 } else if (target_is_android(g->zig_target)) {
1668 crt1o = "crtbegin_dynamic.o";
1663 } else if (!g->have_dynamic_link) {1669 } 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 }
1665 } else {1675 } else {
1666 crt1o = "Scrt1.o";1676 crt1o = "Scrt1.o";
1667 }1677 }
...@@ -1768,21 +1778,27 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1768,21 +1778,27 @@ static void construct_linker_job_elf(LinkJob *lj) {
1768 if (!g->have_dynamic_link) {1778 if (!g->have_dynamic_link) {
1769 lj->args.append("--start-group");1779 lj->args.append("--start-group");
1770 lj->args.append("-lgcc");1780 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 }
1772 lj->args.append("-lc");1784 lj->args.append("-lc");
1773 lj->args.append("-lm");1785 lj->args.append("-lm");
1774 lj->args.append("--end-group");1786 lj->args.append("--end-group");
1775 } else {1787 } else {
1776 lj->args.append("-lgcc");1788 lj->args.append("-lgcc");
1777 lj->args.append("--as-needed");1789 if (!target_is_android(g->zig_target)) {
1778 lj->args.append("-lgcc_s");1790 lj->args.append("--as-needed");
1779 lj->args.append("--no-as-needed");1791 lj->args.append("-lgcc_s");
1792 lj->args.append("--no-as-needed");
1793 }
1780 lj->args.append("-lc");1794 lj->args.append("-lc");
1781 lj->args.append("-lm");1795 lj->args.append("-lm");
1782 lj->args.append("-lgcc");1796 lj->args.append("-lgcc");
1783 lj->args.append("--as-needed");1797 if (!target_is_android(g->zig_target)) {
1784 lj->args.append("-lgcc_s");1798 lj->args.append("--as-needed");
1785 lj->args.append("--no-as-needed");1799 lj->args.append("-lgcc_s");
1800 lj->args.append("--no-as-needed");
1801 }
1786 }1802 }
17871803
1788 if (g->zig_target->os == OsFreeBSD) {1804 if (g->zig_target->os == OsFreeBSD) {
...@@ -1805,7 +1821,9 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -1805,7 +1821,9 @@ static void construct_linker_job_elf(LinkJob *lj) {
1805 }1821 }
18061822
1807 // crt end1823 // 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)) {
1809 lj->args.append(get_libc_crt_file(g, "crtn.o"));1827 lj->args.append(get_libc_crt_file(g, "crtn.o"));
1810 }1828 }
18111829
src/target.cpp+6-2
...@@ -1590,10 +1590,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {...@@ -1590,10 +1590,14 @@ bool target_supports_stack_probing(const ZigTarget *target) {
15901590
1591bool target_requires_pic(const ZigTarget *target, bool linking_libc) {1591bool target_requires_pic(const ZigTarget *target, bool linking_libc) {
1592 // This function returns whether non-pic code is completely invalid on the given target.1592 // 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) ||
1594 (linking_libc && target_is_glibc(target));1594 (linking_libc && target_is_glibc(target));
1595}1595}
15961596
1597bool target_requires_pie(const ZigTarget *target) {
1598 return target_is_android(target);
1599}
1600
1597bool target_is_glibc(const ZigTarget *target) {1601bool target_is_glibc(const ZigTarget *target) {
1598 return target->os == OsLinux && target_abi_is_gnu(target->abi);1602 return target->os == OsLinux && target_abi_is_gnu(target->abi);
1599}1603}
...@@ -1876,7 +1880,7 @@ bool target_supports_libunwind(const ZigTarget *target) {...@@ -1876,7 +1880,7 @@ bool target_supports_libunwind(const ZigTarget *target) {
1876}1880}
18771881
1878bool target_libc_needs_crti_crtn(const ZigTarget *target) {1882bool 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)) {
1880 return false;1884 return false;
1881 }1885 }
1882 return true;1886 return true;
src/target.hpp+1
...@@ -182,6 +182,7 @@ const char *target_libc_generic_name(const ZigTarget *target);...@@ -182,6 +182,7 @@ const char *target_libc_generic_name(const ZigTarget *target);
182bool target_is_libc_lib_name(const ZigTarget *target, const char *name);182bool target_is_libc_lib_name(const ZigTarget *target, const char *name);
183bool target_supports_fpic(const ZigTarget *target);183bool target_supports_fpic(const ZigTarget *target);
184bool target_requires_pic(const ZigTarget *target, bool linking_libc);184bool target_requires_pic(const ZigTarget *target, bool linking_libc);
185bool target_requires_pie(const ZigTarget *target);
185bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);186bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);
186bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);187bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);
187bool target_is_glibc(const ZigTarget *target);188bool target_is_glibc(const ZigTarget *target);