mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
fix regressions on macos
This commit is contained in:
parent
ffaa4f0a87
commit
e2ce00f272
@ -240,10 +240,6 @@ void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type) {
|
||||
g->emit_file_type = emit_file_type;
|
||||
}
|
||||
|
||||
void codegen_set_is_static(CodeGen *g, bool is_static) {
|
||||
g->is_static = is_static;
|
||||
}
|
||||
|
||||
void codegen_set_each_lib_rpath(CodeGen *g, bool each_lib_rpath) {
|
||||
g->each_lib_rpath = each_lib_rpath;
|
||||
}
|
||||
@ -9265,7 +9261,9 @@ void codegen_build_and_link(CodeGen *g) {
|
||||
}
|
||||
}
|
||||
|
||||
if (g->emit_file_type == EmitFileTypeBinary && !compilation_is_already_done(g)) {
|
||||
if (g->emit_file_type == EmitFileTypeBinary &&
|
||||
(g->link_objects.length > 1 || g->out_type != OutTypeObj))
|
||||
{
|
||||
codegen_link(g);
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,6 @@ void codegen_set_is_test(CodeGen *codegen, bool is_test);
|
||||
void codegen_set_each_lib_rpath(CodeGen *codegen, bool each_lib_rpath);
|
||||
|
||||
void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type);
|
||||
void codegen_set_is_static(CodeGen *codegen, bool is_static);
|
||||
void codegen_set_strip(CodeGen *codegen, bool strip);
|
||||
void codegen_set_errmsg_color(CodeGen *codegen, ErrColor err_color);
|
||||
void codegen_set_out_name(CodeGen *codegen, Buf *out_name);
|
||||
|
||||
91
src/link.cpp
91
src/link.cpp
@ -574,7 +574,7 @@ static Buf *build_a_raw(CodeGen *parent_gen, const char *aname, Buf *full_path)
|
||||
|
||||
CodeGen *child_gen = create_child_codegen(parent_gen, full_path, child_out_type,
|
||||
parent_gen->libc);
|
||||
codegen_set_is_static(child_gen, true);
|
||||
child_gen->is_static = true;
|
||||
codegen_set_out_name(child_gen, buf_create_from_str(aname));
|
||||
|
||||
// This is so that compiler_rt and builtin libraries know whether they
|
||||
@ -699,7 +699,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
|
||||
lj->args.append(getLDMOption(g->zig_target));
|
||||
|
||||
bool is_lib = g->out_type == OutTypeLib;
|
||||
bool shared = !g->is_static && is_lib;
|
||||
bool is_dyn_lib = !g->is_static && is_lib;
|
||||
Buf *soname = nullptr;
|
||||
if (g->is_static) {
|
||||
if (g->zig_target->arch == ZigLLVM_arm || g->zig_target->arch == ZigLLVM_armeb ||
|
||||
@ -709,7 +709,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
|
||||
} else {
|
||||
lj->args.append("-static");
|
||||
}
|
||||
} else if (shared) {
|
||||
} else if (is_dyn_lib) {
|
||||
lj->args.append("-shared");
|
||||
|
||||
if (buf_len(&g->output_file_path) == 0) {
|
||||
@ -780,7 +780,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
|
||||
|
||||
}
|
||||
|
||||
if (shared) {
|
||||
if (is_dyn_lib) {
|
||||
lj->args.append("-soname");
|
||||
lj->args.append(buf_ptr(soname));
|
||||
}
|
||||
@ -1231,36 +1231,34 @@ static void construct_linker_job_macho(LinkJob *lj) {
|
||||
}
|
||||
|
||||
bool is_lib = g->out_type == OutTypeLib;
|
||||
bool shared = !g->is_static && is_lib;
|
||||
bool is_dyn_lib = !g->is_static && is_lib;
|
||||
if (g->is_static) {
|
||||
lj->args.append("-static");
|
||||
} else {
|
||||
lj->args.append("-dynamic");
|
||||
}
|
||||
|
||||
if (is_lib) {
|
||||
if (!g->is_static) {
|
||||
lj->args.append("-dylib");
|
||||
if (is_dyn_lib) {
|
||||
lj->args.append("-dylib");
|
||||
|
||||
Buf *compat_vers = buf_sprintf("%" ZIG_PRI_usize ".0.0", g->version_major);
|
||||
lj->args.append("-compatibility_version");
|
||||
lj->args.append(buf_ptr(compat_vers));
|
||||
Buf *compat_vers = buf_sprintf("%" ZIG_PRI_usize ".0.0", g->version_major);
|
||||
lj->args.append("-compatibility_version");
|
||||
lj->args.append(buf_ptr(compat_vers));
|
||||
|
||||
Buf *cur_vers = buf_sprintf("%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,
|
||||
g->version_major, g->version_minor, g->version_patch);
|
||||
lj->args.append("-current_version");
|
||||
lj->args.append(buf_ptr(cur_vers));
|
||||
Buf *cur_vers = buf_sprintf("%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,
|
||||
g->version_major, g->version_minor, g->version_patch);
|
||||
lj->args.append("-current_version");
|
||||
lj->args.append(buf_ptr(cur_vers));
|
||||
|
||||
// TODO getting an error when running an executable when doing this rpath thing
|
||||
//Buf *dylib_install_name = buf_sprintf("@rpath/lib%s.%" ZIG_PRI_usize ".dylib",
|
||||
// buf_ptr(g->root_out_name), g->version_major);
|
||||
//lj->args.append("-install_name");
|
||||
//lj->args.append(buf_ptr(dylib_install_name));
|
||||
// TODO getting an error when running an executable when doing this rpath thing
|
||||
//Buf *dylib_install_name = buf_sprintf("@rpath/lib%s.%" ZIG_PRI_usize ".dylib",
|
||||
// buf_ptr(g->root_out_name), g->version_major);
|
||||
//lj->args.append("-install_name");
|
||||
//lj->args.append(buf_ptr(dylib_install_name));
|
||||
|
||||
if (buf_len(&g->output_file_path) == 0) {
|
||||
buf_appendf(&g->output_file_path, "lib%s.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",
|
||||
buf_ptr(g->root_out_name), g->version_major, g->version_minor, g->version_patch);
|
||||
}
|
||||
if (buf_len(&g->output_file_path) == 0) {
|
||||
buf_appendf(&g->output_file_path, "lib%s.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",
|
||||
buf_ptr(g->root_out_name), g->version_major, g->version_minor, g->version_patch);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1302,38 +1300,14 @@ static void construct_linker_job_macho(LinkJob *lj) {
|
||||
Buf *rpath = g->rpath_list.at(i);
|
||||
add_rpath(lj, rpath);
|
||||
}
|
||||
add_rpath(lj, &g->output_file_path);
|
||||
if (is_dyn_lib) {
|
||||
add_rpath(lj, &g->output_file_path);
|
||||
}
|
||||
|
||||
if (shared) {
|
||||
if (is_dyn_lib) {
|
||||
if (g->system_linker_hack) {
|
||||
lj->args.append("-headerpad_max_install_names");
|
||||
}
|
||||
} else if (g->is_static) {
|
||||
lj->args.append("-lcrt0.o");
|
||||
} else {
|
||||
switch (platform.kind) {
|
||||
case MacOS:
|
||||
if (darwin_version_lt(&platform, 10, 5)) {
|
||||
lj->args.append("-lcrt1.o");
|
||||
} else if (darwin_version_lt(&platform, 10, 6)) {
|
||||
lj->args.append("-lcrt1.10.5.o");
|
||||
} else if (darwin_version_lt(&platform, 10, 8)) {
|
||||
lj->args.append("-lcrt1.10.6.o");
|
||||
}
|
||||
break;
|
||||
case IPhoneOS:
|
||||
if (g->zig_target->arch == ZigLLVM_aarch64) {
|
||||
// iOS does not need any crt1 files for arm64
|
||||
} else if (darwin_version_lt(&platform, 3, 1)) {
|
||||
lj->args.append("-lcrt1.o");
|
||||
} else if (darwin_version_lt(&platform, 6, 0)) {
|
||||
lj->args.append("-lcrt1.3.1.o");
|
||||
}
|
||||
break;
|
||||
case IPhoneOSSimulator:
|
||||
// no crt1.o needed
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < g->lib_dirs.length; i += 1) {
|
||||
@ -1347,7 +1321,7 @@ static void construct_linker_job_macho(LinkJob *lj) {
|
||||
}
|
||||
|
||||
// compiler_rt on darwin is missing some stuff, so we still build it and rely on LinkOnce
|
||||
if (g->out_type == OutTypeExe || (g->out_type == OutTypeLib && !g->is_static)) {
|
||||
if (g->out_type == OutTypeExe || is_dyn_lib) {
|
||||
Buf *compiler_rt_o_path = build_compiler_rt(g);
|
||||
lj->args.append(buf_ptr(compiler_rt_o_path));
|
||||
}
|
||||
@ -1356,11 +1330,7 @@ static void construct_linker_job_macho(LinkJob *lj) {
|
||||
for (size_t lib_i = 0; lib_i < g->link_libs_list.length; lib_i += 1) {
|
||||
LinkLib *link_lib = g->link_libs_list.at(lib_i);
|
||||
if (buf_eql_str(link_lib->name, "c")) {
|
||||
// on Darwin, libSystem has libc in it, but also you have to use it
|
||||
// to make syscalls because the syscall numbers are not documented
|
||||
// and change between versions.
|
||||
// so we always link against libSystem
|
||||
lj->args.append("-lSystem");
|
||||
continue;
|
||||
} else {
|
||||
if (strchr(buf_ptr(link_lib->name), '/') == nullptr) {
|
||||
Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib->name));
|
||||
@ -1370,6 +1340,11 @@ static void construct_linker_job_macho(LinkJob *lj) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// on Darwin, libSystem has libc in it, but also you have to use it
|
||||
// to make syscalls because the syscall numbers are not documented
|
||||
// and change between versions.
|
||||
// so we always link against libSystem
|
||||
lj->args.append("-lSystem");
|
||||
} else {
|
||||
lj->args.append("-undefined");
|
||||
lj->args.append("dynamic_lookup");
|
||||
|
||||
@ -1037,7 +1037,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
codegen_set_llvm_argv(g, llvm_argv.items + 1, llvm_argv.length - 2);
|
||||
codegen_set_strip(g, strip);
|
||||
codegen_set_is_static(g, is_static);
|
||||
g->is_static = is_static;
|
||||
if (dynamic_linker != nullptr)
|
||||
codegen_set_dynamic_linker(g, buf_create_from_str(dynamic_linker));
|
||||
g->verbose_tokenize = verbose_tokenize;
|
||||
|
||||
10
src/os.cpp
10
src/os.cpp
@ -1414,13 +1414,17 @@ static void init_rand() {
|
||||
if (fd == -1) {
|
||||
zig_panic("unable to open /dev/urandom");
|
||||
}
|
||||
const char bytes[sizeof(unsigned)];
|
||||
unsigned seed;
|
||||
while (read(fd, bytes, sizeof(unsigned)) == -1) {
|
||||
char bytes[sizeof(unsigned)];
|
||||
size_t amt_read;
|
||||
while ((amt_read = read(fd, bytes, sizeof(unsigned))) == -1) {
|
||||
if (errno == EINTR) continue;
|
||||
zig_panic("unable to read /dev/urandom");
|
||||
}
|
||||
if (amt_read != sizeof(unsigned)) {
|
||||
zig_panic("unable to read enough bytes from /dev/urandom");
|
||||
}
|
||||
close(fd);
|
||||
unsigned seed;
|
||||
memcpy(&seed, bytes, sizeof(unsigned));
|
||||
srand(seed);
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user