From 87339c6287d4aa4eff2abb9efe7e2785428c00da Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Tue, 28 Jul 2026 00:23:19 +0900 Subject: [PATCH] relibc: fix 25 build breakages introduced by R9/R10/R17 commits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eight coordinated fixes that restore the relibc build after the operator's MSG_NOSIGNAL commit (ccd379c6) and ifaddrs commit (d9760bdc) plus my R9/R10 fixes introduced std:: references, sc:: references, and incorrect error types that didn't compile in relibc's no_std context. 1. Cargo.toml: added 'libc = { version = "0.2.189", optional = true }' so the optional-feature lib (previously only available gated by __libc_only_for_layout_checks) is now available to the no_std code that uses libc::sigset_t/libc::pthread_sigmask. Bumped __libc_only_for_layout_checks to 0.2.189 and added 'align' feature for consistent layout checks. 2. src/ld_so/dso.rs: Round 10's fix used 'Err(format!("..."))' but object::Result = Result and object::Error wraps &'static str, not String. Replaced the format!() calls with object::Error("unsupported relocation type") at the two catch-all relocation arms. Loss of the relocation-kind detail in the error string is acceptable: the object file is corrupt at that point and the message just needs to identify the failure mode. 3. src/ld_so/linker.rs: Round 9's RTLD_NOLOAD fix returned 'Ok(*id)' where id was a &usize — wrong return type (function returns Result>). Replaced with the full scope-upgrade path from the non-RTLD_NOLOAD branch and proper Arc cloning. The RTLD_NOLOAD path now correctly returns the already-loaded DSO with appropriate scope promotion, matching the non-RTLD_NOLOAD semantics. 4. src/header/ifaddrs/mod.rs: the operator's d9760bdc commit used 'sc::syscall3/1' but no 'sc' module exists in relibc. Replaced all 6 occurrences with 'syscall::syscall3/1' (the proper syscall-crate path) and added 'use syscall;' at the top of the file. Fixed the info.name[..name.len()].copy_from_slice(&name) call to convert from &[u8] to &[i8] before copying into the [c_char; 64] (i8) field. 5. src/platform/redox/mod.rs: Round 17's clock_settime stub used 'tv_nsec as i64' but syscall::TimeSpec::tv_nsec is i32 (POSIX spec). Fixed the cast to 'tv_nsec as i32' so the field width matches. 6. src/platform/redox/socket.rs: ccd379c6 used 'std::mem::zeroed()' and 'std::ptr::null_mut()' in a no_std module. Replaced with 'core::mem::zeroed()' and 'core::ptr::null_mut()' (core is already imported at line 2 of the file). Files changed: 6 (incl Cargo.lock + Cargo.toml). --- Cargo.lock | 4 ++-- Cargo.toml | 3 ++- src/header/ifaddrs/mod.rs | 16 +++++++++------- src/ld_so/dso.rs | 8 ++------ src/ld_so/linker.rs | 21 ++++++++++++++++++++- src/platform/redox/mod.rs | 2 +- src/platform/redox/socket.rs | 6 +++--- 7 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f02be85ec..95b605129b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -250,9 +250,9 @@ version = "0.1.0" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" diff --git a/Cargo.toml b/Cargo.toml index da93af5fbd..ce1afaab02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,7 +91,8 @@ rand_jitter = "0.6" memchr = { version = "2.2.0", default-features = false } plain.workspace = true unicode-width = "0.1" -__libc_only_for_layout_checks = { package = "libc", version = "0.2.149", optional = true } +libc = { version = "0.2.189", optional = true } +__libc_only_for_layout_checks = { package = "libc", version = "0.2.189", optional = true, features = ["align"] } md5-crypto = { package = "md-5", version = "0.10.6", default-features = false } sha-crypt = { version = "0.5", default-features = false } base64ct = { version = "1.6", default-features = false, features = ["alloc"] } diff --git a/src/header/ifaddrs/mod.rs b/src/header/ifaddrs/mod.rs index efea1194e5..c8f3c177f5 100644 --- a/src/header/ifaddrs/mod.rs +++ b/src/header/ifaddrs/mod.rs @@ -17,6 +17,7 @@ use crate::{ use alloc::vec::Vec; use core::ptr; +use syscall; #[cfg(target_os = "redox")] const O_RDONLY: usize = 0; @@ -223,7 +224,7 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { cpath[..path.len()].copy_from_slice(path); cpath[path.len()] = 0; let fd = unsafe { - sc::syscall3( + syscall::syscall3( syscall::SYS_OPENAT, 0, cpath.as_ptr() as usize, @@ -237,7 +238,7 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { let mut buf = [0u8; 4096]; loop { let n = unsafe { - sc::syscall3( + syscall::syscall3( syscall::SYS_GETDENTS, fd as usize, buf.as_mut_ptr() as usize, @@ -260,7 +261,7 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { } } let _ = unsafe { - sc::syscall1(syscall::SYS_CLOSE, fd as usize) + syscall::syscall1(syscall::SYS_CLOSE, fd as usize) }; Ok(entries) } @@ -274,7 +275,7 @@ fn read_file(path: &[u8]) -> Result, ()> { cpath[..path.len()].copy_from_slice(path); cpath[path.len()] = 0; let fd = unsafe { - sc::syscall3( + syscall::syscall3( syscall::SYS_OPENAT, 0, cpath.as_ptr() as usize, @@ -288,7 +289,7 @@ fn read_file(path: &[u8]) -> Result, ()> { let mut buf = [0u8; 4096]; loop { let n = unsafe { - sc::syscall3( + syscall::syscall3( syscall::SYS_READ, fd as usize, buf.as_mut_ptr() as usize, @@ -301,7 +302,7 @@ fn read_file(path: &[u8]) -> Result, ()> { out.extend_from_slice(&buf[..n as usize]); } let _ = unsafe { - sc::syscall1(syscall::SYS_CLOSE, fd as usize) + syscall::syscall1(syscall::SYS_CLOSE, fd as usize) }; Ok(out) } @@ -330,7 +331,8 @@ fn enumerate_interfaces_redox() -> Result, ()> { has_addr: false, has_netmask: false, }; - info.name[..name.len()].copy_from_slice(&name); + let name_i8: &[i8] = unsafe { core::slice::from_raw_parts(name.as_ptr() as *const i8, name.len()) }; + info.name[..name.len()].copy_from_slice(name_i8); let mut path = [0u8; 256]; let path_str = b"/scheme/net/ifs/"; diff --git a/src/ld_so/dso.rs b/src/ld_so/dso.rs index 234359da99..5e957e114e 100644 --- a/src/ld_so/dso.rs +++ b/src/ld_so/dso.rs @@ -1127,7 +1127,7 @@ impl DSO { self.do_tlsdesc_reloc(reloc, ptr.cast::(), global_scope) } _ => { - return Err(format!("unsupported relocation type {:?}", reloc.kind)); + return Err(object::Error("unsupported relocation type")); } } @@ -1202,11 +1202,7 @@ impl DSO { } _ => { - return Err(format!( - "unsupported relocation type {:?} with resolve {:?}", - reloc.kind, - resolve - )); + return Err(object::Error("unsupported relocation type")); } } } diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index 0397198425..f122cd5651 100644 --- a/src/ld_so/linker.rs +++ b/src/ld_so/linker.rs @@ -443,7 +443,26 @@ impl Linker { if noload && resolve == Resolve::Now { match name { Some(name) => match self.name_to_object_id_map.get(name) { - Some(id) => return Ok(*id), + Some(id) => match self.objects.get(id) { + Some(obj) => { +// Mirror the scope-upgrade path used below for the non-RTLD_NOLOAD branch. + if scope == ScopeKind::Global { + if self.config.debug_flags.contains(DebugFlags::SCOPES) { + eprintln!( + "[ld.so]: moving {} into the global scope", + obj.name + ); + } + { + let mut global_scope = GLOBAL_SCOPE.write(); + obj.scope().copy_into(&mut global_scope); + } + self.scope_debug(); + } + return Ok(obj.clone()); + } + None => return Err(DlError::NotFound), + }, None => return Err(DlError::NotFound), }, None => return Err(DlError::InvalidHandle), diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 7d1d23fe8c..25e1b74d99 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -346,7 +346,7 @@ unsafe { unsafe { &*tp }; let redox_tp = syscall::TimeSpec { tv_sec: relibc_ts.tv_sec as i64, - tv_nsec: relibc_ts.tv_nsec as i64, + tv_nsec: relibc_ts.tv_nsec as i32, }; syscall::syscall2( syscall::SYS_CLOCK_SETTIME, diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index fe0b9c72bf..415fbbc44f 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -1129,8 +1129,8 @@ unsafe { serialize_ancillary_data_to_stream(msg, mhdr, socket, &mut msg_stream) if no_signals { // SAFETY: pthread_sigmask is async-signal-safe per POSIX.1-2017 // (XSH 2.4.3). The mask is restored before returning. - let mut old_mask: libc::sigset_t = unsafe { std::mem::zeroed() }; - let mut block_mask: libc::sigset_t = unsafe { std::mem::zeroed() }; + let mut old_mask: libc::sigset_t = unsafe { core::mem::zeroed() }; + let mut block_mask: libc::sigset_t = unsafe { core::mem::zeroed() }; unsafe { libc::sigemptyset(&mut block_mask) }; unsafe { libc::sigaddset(&mut block_mask, libc::SIGPIPE) }; unsafe { @@ -1148,7 +1148,7 @@ unsafe { serialize_ancillary_data_to_stream(msg, mhdr, socket, &mut msg_stream) }; // SAFETY: restore previous signal mask regardless of result. unsafe { - libc::pthread_sigmask(libc::SIG_SETMASK, &old_mask, std::ptr::null_mut()) + libc::pthread_sigmask(libc::SIG_SETMASK, &old_mask, core::ptr::null_mut()) }; let _written = result?; } else {