diff --git a/src/codegen.cpp b/src/codegen.cpp index fbf6c98f12..188c5ccc8d 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8390,15 +8390,16 @@ void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_pa } } - args.append("-isystem"); - args.append(buf_ptr(g->zig_c_headers_dir)); - for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { Buf *include_dir = g->libc_include_dir_list[i]; args.append("-isystem"); args.append(buf_ptr(include_dir)); } + // According to Rich Felker libc headers are supposed to go before C language headers. + args.append("-isystem"); + args.append(buf_ptr(g->zig_c_headers_dir)); + if (g->zig_target->is_native) { args.append("-march=native"); } else { diff --git a/src/link.cpp b/src/link.cpp index 4d2144f5cc..44b3abaa90 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -1775,11 +1775,15 @@ static void construct_linker_job_elf(LinkJob *lj) { lj->args.append("--no-as-needed"); } } else if (target_is_glibc(g->zig_target)) { - lj->args.append(build_libunwind(g)); + if (target_supports_libunwind(g->zig_target)) { + lj->args.append(build_libunwind(g)); + } add_glibc_libs(lj); lj->args.append(get_libc_crt_file(g, "libc_nonshared.a")); } else if (target_is_musl(g->zig_target)) { - lj->args.append(build_libunwind(g)); + if (target_supports_libunwind(g->zig_target)) { + lj->args.append(build_libunwind(g)); + } lj->args.append(build_musl(g)); } else { zig_unreachable(); diff --git a/src/target.cpp b/src/target.cpp index e5226bd520..804c421618 100644 --- a/src/target.cpp +++ b/src/target.cpp @@ -1687,3 +1687,9 @@ const char *target_arch_musl_name(ZigLLVM_ArchType arch) { } } +bool target_supports_libunwind(const ZigTarget *target) { + if (target->arch == ZigLLVM_arm || target->arch == ZigLLVM_armeb) { + return false; + } + return true; +} diff --git a/src/target.hpp b/src/target.hpp index 483172cc94..fcda9955b9 100644 --- a/src/target.hpp +++ b/src/target.hpp @@ -189,6 +189,7 @@ bool target_is_single_threaded(const ZigTarget *target); bool target_supports_stack_probing(const ZigTarget *target); bool target_has_debug_info(const ZigTarget *target); const char *target_arch_musl_name(ZigLLVM_ArchType arch); +bool target_supports_libunwind(const ZigTarget *target); uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch);