From f7bf61a98349c7d888e8808047912c482a2d2560 Mon Sep 17 00:00:00 2001 From: meme Date: Fri, 27 Sep 2019 16:51:42 -0400 Subject: support Android NDK and bionic --- src/link.cpp | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'src/link.cpp') diff --git a/src/link.cpp b/src/link.cpp index 41fb2ca415..07258943ca 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1653,6 +1653,10 @@ static void construct_linker_job_elf(LinkJob *lj) { soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major); } + if (target_requires_pie(g->zig_target) && !is_dyn_lib) { + lj->args.append("-pie"); + } + lj->args.append("-o"); lj->args.append(buf_ptr(&g->output_file_path)); @@ -1660,8 +1664,14 @@ static void construct_linker_job_elf(LinkJob *lj) { const char *crt1o; if (g->zig_target->os == OsNetBSD) { crt1o = "crt0.o"; + } else if (target_is_android(g->zig_target)) { + crt1o = "crtbegin_dynamic.o"; } else if (!g->have_dynamic_link) { - crt1o = "crt1.o"; + if (target_is_android(g->zig_target)) { + crt1o = "crtbegin.o"; + } else { + crt1o = "crt1.o"; + } } else { crt1o = "Scrt1.o"; } @@ -1768,21 +1778,27 @@ static void construct_linker_job_elf(LinkJob *lj) { if (!g->have_dynamic_link) { lj->args.append("--start-group"); lj->args.append("-lgcc"); - lj->args.append("-lgcc_eh"); + if (!target_is_android(g->zig_target)) { + lj->args.append("-lgcc_eh"); + } lj->args.append("-lc"); lj->args.append("-lm"); lj->args.append("--end-group"); } else { lj->args.append("-lgcc"); - lj->args.append("--as-needed"); - lj->args.append("-lgcc_s"); - lj->args.append("--no-as-needed"); + if (!target_is_android(g->zig_target)) { + lj->args.append("--as-needed"); + lj->args.append("-lgcc_s"); + lj->args.append("--no-as-needed"); + } lj->args.append("-lc"); lj->args.append("-lm"); lj->args.append("-lgcc"); - lj->args.append("--as-needed"); - lj->args.append("-lgcc_s"); - lj->args.append("--no-as-needed"); + if (!target_is_android(g->zig_target)) { + lj->args.append("--as-needed"); + lj->args.append("-lgcc_s"); + lj->args.append("--no-as-needed"); + } } if (g->zig_target->os == OsFreeBSD) { @@ -1805,7 +1821,9 @@ static void construct_linker_job_elf(LinkJob *lj) { } // crt end - if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) { + if (target_is_android(g->zig_target) && g->have_dynamic_link) { + lj->args.append(get_libc_crt_file(g, "crtend_android.o")); + } else if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) { lj->args.append(get_libc_crt_file(g, "crtn.o")); } -- cgit v1.2.3 From 308e7d531452a06be815218f781ecd40afe451ac Mon Sep 17 00:00:00 2001 From: meme Date: Fri, 27 Sep 2019 17:33:07 -0400 Subject: fix building static Android executables --- src/link.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/link.cpp') diff --git a/src/link.cpp b/src/link.cpp index 07258943ca..879c8d75fe 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1653,7 +1653,7 @@ static void construct_linker_job_elf(LinkJob *lj) { soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major); } - if (target_requires_pie(g->zig_target) && !is_dyn_lib) { + if (target_requires_pie(g->zig_target) && !is_dyn_lib && g->libc != nullptr) { lj->args.append("-pie"); } @@ -1821,7 +1821,7 @@ static void construct_linker_job_elf(LinkJob *lj) { } // crt end - if (target_is_android(g->zig_target) && g->have_dynamic_link) { + if (target_is_android(g->zig_target) && g->libc != nullptr) { lj->args.append(get_libc_crt_file(g, "crtend_android.o")); } else if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) { lj->args.append(get_libc_crt_file(g, "crtn.o")); -- cgit v1.2.3 From 0c556095f40bfd935bf1c1c8a638b7bc8dfcfb8a Mon Sep 17 00:00:00 2001 From: meme Date: Sat, 28 Sep 2019 12:48:13 -0400 Subject: do not link against gcc runtime on Android target --- src/link.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/link.cpp') diff --git a/src/link.cpp b/src/link.cpp index 879c8d75fe..0149f1642d 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1777,24 +1777,24 @@ static void construct_linker_job_elf(LinkJob *lj) { if (g->libc != nullptr) { if (!g->have_dynamic_link) { lj->args.append("--start-group"); - lj->args.append("-lgcc"); if (!target_is_android(g->zig_target)) { + lj->args.append("-lgcc"); lj->args.append("-lgcc_eh"); } lj->args.append("-lc"); lj->args.append("-lm"); lj->args.append("--end-group"); } else { - lj->args.append("-lgcc"); if (!target_is_android(g->zig_target)) { + lj->args.append("-lgcc"); lj->args.append("--as-needed"); lj->args.append("-lgcc_s"); lj->args.append("--no-as-needed"); } lj->args.append("-lc"); lj->args.append("-lm"); - lj->args.append("-lgcc"); if (!target_is_android(g->zig_target)) { + lj->args.append("-lgcc"); lj->args.append("--as-needed"); lj->args.append("-lgcc_s"); lj->args.append("--no-as-needed"); -- cgit v1.2.3 From 030abfa0d2a95fb5cb9da61c59bb8332c65f8819 Mon Sep 17 00:00:00 2001 From: meme Date: Sat, 28 Sep 2019 13:21:29 -0400 Subject: minor tweaks --- src/link.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src/link.cpp') diff --git a/src/link.cpp b/src/link.cpp index 0149f1642d..785983cecf 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1653,7 +1653,7 @@ static void construct_linker_job_elf(LinkJob *lj) { soname = buf_sprintf("lib%s.so.%" ZIG_PRI_usize, buf_ptr(g->root_out_name), g->version_major); } - if (target_requires_pie(g->zig_target) && !is_dyn_lib && g->libc != nullptr) { + if (target_requires_pie(g->zig_target) && g->out_type == OutTypeExe) { lj->args.append("-pie"); } @@ -1665,13 +1665,13 @@ static void construct_linker_job_elf(LinkJob *lj) { if (g->zig_target->os == OsNetBSD) { crt1o = "crt0.o"; } else if (target_is_android(g->zig_target)) { - crt1o = "crtbegin_dynamic.o"; - } else if (!g->have_dynamic_link) { - if (target_is_android(g->zig_target)) { - crt1o = "crtbegin.o"; + if (g->have_dynamic_link) { + crt1o = "crtbegin_dynamic.o"; } else { - crt1o = "crt1.o"; + crt1o = "crtbegin_static.o"; } + } else if (!g->have_dynamic_link) { + crt1o = "crt1.o"; } else { crt1o = "Scrt1.o"; } @@ -1821,10 +1821,12 @@ static void construct_linker_job_elf(LinkJob *lj) { } // crt end - if (target_is_android(g->zig_target) && g->libc != nullptr) { - lj->args.append(get_libc_crt_file(g, "crtend_android.o")); - } else if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) { - lj->args.append(get_libc_crt_file(g, "crtn.o")); + if (lj->link_in_crt) { + if (target_is_android(g->zig_target)) { + lj->args.append(get_libc_crt_file(g, "crtend_android.o")); + } else if (target_libc_needs_crti_crtn(g->zig_target)) { + lj->args.append(get_libc_crt_file(g, "crtn.o")); + } } if (!g->zig_target->is_native) { -- cgit v1.2.3