code cleanups
* in selfExePath, return errors instead of defaulting to bogus data * less invasive edits to the logic of link/Elf.zig * less indentation
This commit is contained in:
@@ -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 => {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user