diff --git a/lib/std/fs.zig b/lib/std/fs.zig index ffec9e0fa1..b4da2e0a5c 100644 --- a/lib/std/fs.zig +++ b/lib/std/fs.zig @@ -2234,40 +2234,39 @@ pub fn selfExePath(out_buffer: []u8) SelfExePathError![]u8 { }, .openbsd => { // OpenBSD doesn't support getting the path of a running process, so try to guess it - if (os.argv.len >= 1) { - const argv0 = mem.span(os.argv[0]); - if (mem.indexOf(u8, argv0, "/") != null) { - // argv[0] is a path (relative or absolute): use realpath(3) directly - var real_path_buf: [MAX_PATH_BYTES]u8 = undefined; - const real_path = try os.realpathZ(os.argv[0], &real_path_buf); - if (real_path.len > out_buffer.len) - return error.NameTooLong; - mem.copy(u8, out_buffer, real_path); - return out_buffer[0..real_path.len]; - } else if (argv0.len != 0) { - // argv[0] is not empty (and not a path): search it inside PATH - const PATH = std.os.getenv("PATH") orelse ""; - var path_it = mem.tokenize(PATH, &[_]u8{path.delimiter}); - while (path_it.next()) |a_path| { - var resolved_path_buf: [MAX_PATH_BYTES-1:0]u8 = undefined; - const resolved_path = std.fmt.bufPrint(&resolved_path_buf, "{}/{}\x00", .{ - a_path, - os.argv[0], - }) catch ""; + if (os.argv.len == 0) + return error.FileNotFound; - var real_path_buf: [MAX_PATH_BYTES]u8 = undefined; - if (os.realpathZ(&resolved_path_buf, &real_path_buf) catch null) |real_path| { - // found a file, and hope it is the right file - if (real_path.len > out_buffer.len) - return error.NameTooLong; - mem.copy(u8, out_buffer, real_path); - return out_buffer[0..real_path.len]; - } - } + const argv0 = mem.span(os.argv[0]); + if (mem.indexOf(u8, argv0, "/") != null) { + // argv[0] is a path (relative or absolute): use realpath(3) directly + var real_path_buf: [MAX_PATH_BYTES]u8 = undefined; + const real_path = try os.realpathZ(os.argv[0], &real_path_buf); + if (real_path.len > out_buffer.len) + return error.NameTooLong; + mem.copy(u8, out_buffer, real_path); + return out_buffer[0..real_path.len]; + } else if (argv0.len != 0) { + // argv[0] is not empty (and not a path): search it inside PATH + const PATH = std.os.getenvZ("PATH") orelse return error.FileNotFound; + var path_it = mem.tokenize(PATH, &[_]u8{path.delimiter}); + while (path_it.next()) |a_path| { + var resolved_path_buf: [MAX_PATH_BYTES]u8 = undefined; + const resolved_path = std.fmt.bufPrintZ(&resolved_path_buf, "{s}/{s}", .{ + a_path, + os.argv[0], + }) catch continue; + + var real_path_buf: [MAX_PATH_BYTES]u8 = undefined; + if (os.realpathZ(&resolved_path_buf, &real_path_buf)) |real_path| { + // found a file, and hope it is the right file + if (real_path.len > out_buffer.len) + return error.NameTooLong; + mem.copy(u8, out_buffer, real_path); + return out_buffer[0..real_path.len]; + } else |_| continue; } } - - // sorry, we don't find it return error.FileNotFound; }, .windows => { diff --git a/lib/std/os/bits/openbsd.zig b/lib/std/os/bits/openbsd.zig index a972ea097b..1419e7f27a 100644 --- a/lib/std/os/bits/openbsd.zig +++ b/lib/std/os/bits/openbsd.zig @@ -174,7 +174,7 @@ pub const Stat = extern struct { blksize: blksize_t, flags: u32, gen: u32, - birthtim: timespec, + birthtim: timespec, pub fn atime(self: Stat) timespec { return self.atim; @@ -203,7 +203,7 @@ pub const dirent = extern struct { d_type: u8, d_namlen: u8, __d_padding: [4]u8, - d_name: [MAXNAMLEN+1]u8, + d_name: [MAXNAMLEN + 1]u8, pub fn reclen(self: dirent) u16 { return self.d_reclen; diff --git a/src/link/Elf.zig b/src/link/Elf.zig index f111ad9205..b7e540483e 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1448,14 +1448,10 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { }; try argv.append(try comp.get_libc_crt_file(arena, crt1o)); if (target_util.libc_needs_crti_crtn(target)) { - const crti_o = o: { - if (target.os.tag == .openbsd) { - break :o "crtbegin.o"; - } else { - break :o "crti.o"; - } - }; - try argv.append(try comp.get_libc_crt_file(arena, crti_o)); + try argv.append(try comp.get_libc_crt_file(arena, "crti.o")); + } + if (target.os.tag == .openbsd) { + try argv.append(try comp.get_libc_crt_file(arena, "crtbegin.o")); } } @@ -1599,17 +1595,12 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { // crt end if (link_in_crt) { - if (target.isAndroid() or target_util.libc_needs_crti_crtn(target)) { - const crtn_o = o: { - if (target.os.tag == .openbsd) { - break :o "crtend.o"; - } else if (target.isAndroid()) { - break :o "crtend_android.o"; - } else { - break :o "crtn.o"; - } - }; - try argv.append(try comp.get_libc_crt_file(arena, crtn_o)); + if (target.isAndroid()) { + try argv.append(try comp.get_libc_crt_file(arena, "crtend_android.o")); + } else if (target.os.tag == .openbsd) { + try argv.append(try comp.get_libc_crt_file(arena, "crtend.o")); + } else if (target_util.libc_needs_crti_crtn(target)) { + try argv.append(try comp.get_libc_crt_file(arena, "crtn.o")); } } diff --git a/src/stage1.zig b/src/stage1.zig index 7214ae21b9..d07a1c199c 100644 --- a/src/stage1.zig +++ b/src/stage1.zig @@ -26,8 +26,8 @@ pub const log = stage2.log; pub const log_level = stage2.log_level; pub export fn main(argc: c_int, argv: [*][*:0]u8) c_int { - std.os.argv = argv[0.. @intCast(usize, argc)]; - + std.os.argv = argv[0..@intCast(usize, argc)]; + std.debug.maybeEnableSegfaultHandler(); zig_stage1_os_init(); diff --git a/src/target.zig b/src/target.zig index 7ed040c361..9415ddaf70 100644 --- a/src/target.zig +++ b/src/target.zig @@ -161,7 +161,7 @@ pub fn supports_fpic(target: std.Target) bool { } pub fn libc_needs_crti_crtn(target: std.Target) bool { - return !(target.cpu.arch.isRISCV() or target.isAndroid()); + return !(target.cpu.arch.isRISCV() or target.isAndroid() or target.os.tag == .openbsd); } pub fn isSingleThreaded(target: std.Target) bool {