Commit 05b1a7414e

Andrew Kelley <andrew@ziglang.org>
2020-10-18 02:52:09
code cleanups
* in selfExePath, return errors instead of defaulting to bogus data * less invasive edits to the logic of link/Elf.zig * less indentation
1 parent 03f7cff
Changed files (5)
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;
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
+            if (os.argv.len == 0)
+                return error.FileNotFound;
+
+            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;
-                    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 "";
-
-                        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];
-                        }
-                    }
+                    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 => {
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"));
         }
     }
 
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();
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 {