From: Mark Wielaard Date: Sat, 28 Dec 2024 00:29:58 +0000 (+0100) Subject: riscv64: Add hardwire for ld-linux-riscv64-lp64d.so.1 strcmp X-Git-Tag: VALGRIND_3_25_0~127 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d09ef48e22061b143cd4765e8defb63f5d5024a;p=thirdparty%2Fvalgrind.git riscv64: Add hardwire for ld-linux-riscv64-lp64d.so.1 strcmp When using dlopen ld.so can end up in glibc strcmp_unaligned_loop which causes undefined reads. Hardwire strcmp for ld.so with a simple assembly implementation. --- diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index 958f3e7c4..5e7bc42f9 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -1714,6 +1714,11 @@ void VG_(redir_initialise) ( void ) (Addr)&VG_(riscv64_linux_REDIR_FOR_index), complain_about_stripped_glibc_ldso ); + add_hardwired_spec( + "ld-linux-riscv64-lp64d.so.1", "strcmp", + (Addr)&VG_(riscv64_linux_REDIR_FOR_strcmp), + complain_about_stripped_glibc_ldso + ); } # elif defined(VGP_x86_solaris) diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S index c506070d6..4860a2259 100644 --- a/coregrind/m_trampoline.S +++ b/coregrind/m_trampoline.S @@ -1647,6 +1647,23 @@ VG_(riscv64_linux_REDIR_FOR_index): ret .size VG_(riscv64_linux_REDIR_FOR_index), .-VG_(riscv64_linux_REDIR_FOR_index) +.global VG_(riscv64_linux_REDIR_FOR_strcmp) +.type VG_(riscv64_linux_REDIR_FOR_strcmp), @function +VG_(riscv64_linux_REDIR_FOR_strcmp): +0: + lbu a5, 0(a0) /* load *s1 */ + lbu a4, 0(a1) /* load *s2 */ + beqz a5, 1f /* check end of s1 */ + beq a5, a4, 2f /* loop if *s1 == *s2 */ +1: + subw a0, a5, a4 /* return value is *s1 - *s2 */ + ret +2: + addi a0, a0, 1 /* next char in s1 */ + addi a1, a1, 1 /* next char in s2 */ + j 0b /* and back to the start */ +.size VG_(riscv64_linux_REDIR_FOR_strcmp), .-VG_(riscv64_linux_REDIR_FOR_strcmp) + .global VG_(trampoline_stuff_end) VG_(trampoline_stuff_end): diff --git a/coregrind/pub_core_trampoline.h b/coregrind/pub_core_trampoline.h index 7e9e2d76b..db497c51a 100644 --- a/coregrind/pub_core_trampoline.h +++ b/coregrind/pub_core_trampoline.h @@ -180,6 +180,7 @@ extern UInt VG_(nanomips_linux_REDIR_FOR_strlen)( void* ); extern Addr VG_(riscv64_linux_SUBST_FOR_rt_sigreturn); extern HChar* VG_(riscv64_linux_REDIR_FOR_index)( const HChar*, Int ); extern SizeT VG_(riscv64_linux_REDIR_FOR_strlen)( const HChar* ); +extern Int VG_(riscv64_linux_REDIR_FOR_strcmp)( const HChar*, const HChar* ); #endif #if defined(VGP_x86_solaris)