Merge pull request #16977 from kcbanner/lib_getauxval_fixup

linux: export getauxval when not compiling with libc
This commit is contained in:
Jakub Konka 2023-09-04 09:11:15 +02:00 committed by GitHub
commit 0e8f130aed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -154,8 +154,22 @@ pub usingnamespace @import("linux/io_uring.zig");
/// Set by startup code, used by `getauxval`.
pub var elf_aux_maybe: ?[*]std.elf.Auxv = null;
/// See `std.elf` for the constants.
pub fn getauxval(index: usize) usize {
pub usingnamespace if (switch (builtin.zig_backend) {
// Calling extern functions is not yet supported with these backends
.stage2_x86_64, .stage2_aarch64, .stage2_arm, .stage2_riscv64, .stage2_sparc64 => false,
else => !builtin.link_libc,
}) struct {
/// See `std.elf` for the constants.
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });
}
} else struct {
pub const getauxval = getauxvalImpl;
};
fn getauxvalImpl(index: usize) callconv(.C) usize {
const auxv = elf_aux_maybe orelse return 0;
var i: usize = 0;
while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {