diff --git a/lib/libc/glibc/csu/elf-init-2.33.c b/lib/libc/glibc/csu/elf-init-2.33.c index b713c8b0fb50..42ce6583fece 100644 --- a/lib/libc/glibc/csu/elf-init-2.33.c +++ b/lib/libc/glibc/csu/elf-init-2.33.c @@ -34,6 +34,7 @@ . */ #include +#include /* These magic symbols are provided by the linker. */ diff --git a/lib/libc/glibc/sysdeps/generic/elf-initfini.h b/lib/libc/glibc/sysdeps/generic/elf-initfini.h new file mode 100644 index 000000000000..6630cc8de92e --- /dev/null +++ b/lib/libc/glibc/sysdeps/generic/elf-initfini.h @@ -0,0 +1 @@ +#define NO_INITFINI 1 diff --git a/lib/libc/glibc/sysdeps/generic/sysdep.h b/lib/libc/glibc/sysdeps/generic/sysdep.h index e77be376f7a8..7caa7d76a95c 100644 --- a/lib/libc/glibc/sysdeps/generic/sysdep.h +++ b/lib/libc/glibc/sysdeps/generic/sysdep.h @@ -56,6 +56,12 @@ # define cfi_personality(enc, exp) .cfi_personality enc, exp # define cfi_lsda(enc, exp) .cfi_lsda enc, exp +# ifndef __clang__ +# define cfi_label(label) .cfi_label label +# else +# define cfi_label(label) +# endif + #else /* ! ASSEMBLER */ # define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name) diff --git a/lib/libc/glibc/sysdeps/riscv/start-2.33.S b/lib/libc/glibc/sysdeps/riscv/start-2.33.S index 09511b1ef823..8057b4d464ae 100644 --- a/lib/libc/glibc/sysdeps/riscv/start-2.33.S +++ b/lib/libc/glibc/sysdeps/riscv/start-2.33.S @@ -45,7 +45,7 @@ ENTRY (ENTRY_POINT) /* Terminate call stack by noting ra is undefined. Use a dummy .cfi_label to force starting the FDE. */ - .cfi_label .Ldummy + cfi_label (.Ldummy) cfi_undefined (ra) call load_gp mv a5, a0 /* rtld_fini. */ diff --git a/lib/libc/glibc/sysdeps/riscv/start.S b/lib/libc/glibc/sysdeps/riscv/start.S index 6dfe65273f2e..837031148630 100644 --- a/lib/libc/glibc/sysdeps/riscv/start.S +++ b/lib/libc/glibc/sysdeps/riscv/start.S @@ -45,7 +45,7 @@ ENTRY (ENTRY_POINT) /* Terminate call stack by noting ra is undefined. Use a dummy .cfi_label to force starting the FDE. */ - .cfi_label .Ldummy + cfi_label (.Ldummy) cfi_undefined (ra) call load_gp mv a5, a0 /* rtld_fini. */ diff --git a/lib/libc/include/riscv64-linux-gnu/gnu/stubs-lp64d.h b/lib/libc/include/riscv64-linux-gnu/gnu/stubs-lp64d.h new file mode 100644 index 000000000000..0ba0dd8b5434 --- /dev/null +++ b/lib/libc/include/riscv64-linux-gnu/gnu/stubs-lp64d.h @@ -0,0 +1,24 @@ +/* This file is automatically generated. + It defines a symbol `__stub_FUNCTION' for each function + in the C library which is a stub, meaning it will fail + every time called, usually setting errno to ENOSYS. */ + +#ifdef _LIBC +# error Applications may not define the macro _LIBC +#endif + +#define __stub___compat_bdflush +#define __stub___compat_create_module +#define __stub___compat_get_kernel_syms +#define __stub___compat_query_module +#define __stub___compat_uselib +#define __stub_chflags +#define __stub_fchflags +#define __stub_fedisableexcept +#define __stub_feenableexcept +#define __stub_fegetexcept +#define __stub_gtty +#define __stub_revoke +#define __stub_setlogin +#define __stub_sigreturn +#define __stub_stty diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 4e150f796202..a85602a0e9a7 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1671,8 +1671,26 @@ pub fn standardDynamicLinkerPath_cpu_os_abi(cpu: Cpu, os_tag: Os.Tag, abi: Abi) else => "/lib64/ld-linux-x86-64.so.2", }), - .riscv32 => return copy(&result, "/lib/ld-linux-riscv32-ilp32.so.1"), - .riscv64 => return copy(&result, "/lib/ld-linux-riscv64-lp64.so.1"), + .riscv32 => { + var fpstyle: [:0]const u8 = ""; + if (std.Target.riscv.featureSetHas(cpu.features, .d)) { + fpstyle = "d"; + } else if (abi == .gnueabihf or abi == .musleabihf or abi == .eabihf) { + fpstyle = "f"; // AFAICT, "float" ABIs are not supported with a dynamically linked executable + } else if (std.Target.riscv.featureSetHas(cpu.features, .e)) { + fpstyle = "e"; + } + return print(&result, "/lib/ld-linux-riscv32-ilp32{s}.so.1", .{fpstyle}); + }, + .riscv64 => { + var fpstyle: [:0]const u8 = ""; + if (std.Target.riscv.featureSetHas(cpu.features, .d)) { + fpstyle = "d"; + } else if (abi == .gnueabihf or abi == .musleabihf or abi == .eabihf) { + fpstyle = "f"; // AFAICT, "float" ABIs are not supported with a dynamically linked executable + } + return print(&result, "/lib/ld-linux-riscv64-lp64{s}.so.1", .{fpstyle}); + }, // Architectures in this list have been verified as not having a standard // dynamic linker path. diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 7f44cfa77090..ed4eb0f1bbe9 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -194,7 +194,7 @@ pub fn dumpCurrentStackTrace(start_addr: ?usize) void { pub const have_ucontext = @hasDecl(os.system, "ucontext_t") and (builtin.os.tag != .linux or switch (builtin.cpu.arch) { - .mips, .mipsel, .mips64, .mips64el, .riscv64 => false, + .mips, .mipsel, .mips64, .mips64el => false, else => true, }); diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 45821ddefae7..3c0342d9f30c 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -9,6 +9,8 @@ const pid_t = std.os.linux.pid_t; const sockaddr = linux.sockaddr; const socklen_t = linux.socklen_t; const timespec = std.os.linux.timespec; +const stack_t = linux.stack_t; +const sigset_t = linux.sigset_t; pub fn syscall0(number: SYS) usize { return asm volatile ("ecall" @@ -246,3 +248,56 @@ pub const Stat = extern struct { pub const Elf_Symndx = u32; pub const VDSO = struct {}; + +pub const userregs_t = extern struct { + pc: u64, + ra: u64, + sp: u64, + gp: u64, + tp: u64, + t0: u64, + t1: u64, + t2: u64, + s0: u64, + s1: u64, + a0: u64, + a1: u64, + a2: u64, + a3: u64, + a4: u64, + a5: u64, + a6: u64, + a7: u64, + s2: u64, + s3: u64, + s4: u64, + s5: u64, + s6: u64, + s7: u64, + s8: u64, + s9: u64, + s10: u64, + s11: u64, + t3: u64, + t4: u64, + t5: u64, + t6: u64, +}; + +pub const fpregs_t = extern struct { + f: [528]u8, +}; + +pub const mcontext_t = extern struct { + userregs: userregs_t, + fpregs: fpregs_t, +}; + +pub const ucontext_t = extern struct { + flags: u64, + link: ?*ucontext_t, + stack: stack_t, + sigmask: sigset_t, + reserved: [8]u8 = undefined, + mcontext: mcontext_t, +};