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,
+};