diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-09-28 13:30:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-28 13:30:19 -0400 |
| commit | 543e729398c2ae2a6fbae8ab54ce0737d35004a0 (patch) | |
| tree | 0d2e1a26dd54da64ac6e8183212dfb7032b47b3a /src/link.cpp | |
| parent | ce0e7940926ec4c4eeb95e2d5b67554de3863a56 (diff) | |
| parent | 030abfa0d2a95fb5cb9da61c59bb8332c65f8819 (diff) | |
| download | zig-543e729398c2ae2a6fbae8ab54ce0737d35004a0.tar.gz zig-543e729398c2ae2a6fbae8ab54ce0737d35004a0.zip | |
Merge pull request #3331 from meme/android-ndk
Support Android NDK
Diffstat (limited to 'src/link.cpp')
| -rw-r--r-- | src/link.cpp | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/src/link.cpp b/src/link.cpp index d33ab10ebf..cf473b8cd7 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1657,6 +1657,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) && g->out_type == OutTypeExe) { + lj->args.append("-pie"); + } + lj->args.append("-o"); lj->args.append(buf_ptr(&g->output_file_path)); @@ -1664,6 +1668,12 @@ 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)) { + if (g->have_dynamic_link) { + crt1o = "crtbegin_dynamic.o"; + } else { + crt1o = "crtbegin_static.o"; + } } else if (!g->have_dynamic_link) { crt1o = "crt1.o"; } else { @@ -1771,22 +1781,28 @@ 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"); - lj->args.append("-lgcc_eh"); + 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"); - 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("-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"); - 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("-lgcc"); + lj->args.append("--as-needed"); + lj->args.append("-lgcc_s"); + lj->args.append("--no-as-needed"); + } } if (g->zig_target->os == OsFreeBSD) { @@ -1809,8 +1825,12 @@ static void construct_linker_job_elf(LinkJob *lj) { } // crt end - 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) { |
