aboutsummaryrefslogtreecommitdiff
path: root/src/link.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-09-28 13:30:19 -0400
committerGitHub <noreply@github.com>2019-09-28 13:30:19 -0400
commit543e729398c2ae2a6fbae8ab54ce0737d35004a0 (patch)
tree0d2e1a26dd54da64ac6e8183212dfb7032b47b3a /src/link.cpp
parentce0e7940926ec4c4eeb95e2d5b67554de3863a56 (diff)
parent030abfa0d2a95fb5cb9da61c59bb8332c65f8819 (diff)
downloadzig-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.cpp44
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) {