From: Tom Hughes Date: Thu, 2 Jul 2009 13:02:12 +0000 (+0000) Subject: Replace strlen on amd64-linux with a simple version that doesn't X-Git-Tag: svn/VALGRIND_3_5_0~444 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ddeb03e5b3e2f109f78a14fe272968173a8167f;p=thirdparty%2Fvalgrind.git Replace strlen on amd64-linux with a simple version that doesn't generate false positives. Patch from Jakub Jelinek . Fixes #190429. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10402 --- diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index d824a79a42..570d996ce5 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -879,6 +879,20 @@ void VG_(redir_initialise) ( void ) (Addr)&VG_(amd64_linux_REDIR_FOR_vtime) ); + /* If we're using memcheck, use these intercepts right from + the start, otherwise ld.so makes a lot of noise. */ + if (0==VG_(strcmp)("Memcheck", VG_(details).name)) { + + static const HChar croakage[] + = "Possible fix: install glibc's debuginfo package on this machine."; + + /* this is mandatory - can't sanely continue without it */ + add_hardwired_spec( + "ld-linux-x86-64.so.2", "strlen", + (Addr)&VG_(amd64_linux_REDIR_FOR_strlen), + croakage + ); + } # elif defined(VGP_ppc32_linux) { static const HChar croakage[] diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S index 8b3487ef9f..256666bdf4 100644 --- a/coregrind/m_trampoline.S +++ b/coregrind/m_trampoline.S @@ -168,7 +168,29 @@ VG_(amd64_linux_REDIR_FOR_vtime): .LfnE3: .size VG_(amd64_linux_REDIR_FOR_vtime), .-.LfnB3 -/* A CIE for the above two functions, followed by their FDEs */ +/* There's no particular reason that this needs to be handwritten + assembly, but since that's what this file contains, here's a + simple strlen implementation (written in C and compiled by gcc.) +*/ +.global VG_(amd64_linux_REDIR_FOR_strlen) +.type VG_(amd64_linux_REDIR_FOR_strlen), @function +VG_(amd64_linux_REDIR_FOR_strlen): +.LfnB4: + xorl %eax, %eax + cmpb $0, (%rdi) + movq %rdi, %rdx + je .L41 +.L40: addq $1, %rdx + cmpb $0, (%rdx) + jne .L40 + movq %rdx, %rax + subq %rdi, %rax +.L41: ret +.LfnE4: +.size VG_(amd64_linux_REDIR_FOR_strlen), .-VG_(amd64_linux_REDIR_FOR_strlen) + + +/* A CIE for the above three functions, followed by their FDEs */ .section .eh_frame,"a",@progbits .Lframe1: .long .LEcie1-.LScie1 @@ -206,6 +228,15 @@ VG_(amd64_linux_REDIR_FOR_vtime): .uleb128 0x0 .align 8 .LEfde3: +.LSfde4: + .long .LEfde4-.LASfde4 +.LASfde4: + .long .LASfde4-.Lframe1 + .long .LfnB4 + .long .LfnE4-.LfnB4 + .uleb128 0x0 + .align 8 +.LEfde4: .previous .global VG_(trampoline_stuff_end) diff --git a/coregrind/pub_core_trampoline.h b/coregrind/pub_core_trampoline.h index c8c6520744..31c591cb94 100644 --- a/coregrind/pub_core_trampoline.h +++ b/coregrind/pub_core_trampoline.h @@ -66,6 +66,7 @@ extern Char* VG_(x86_linux_REDIR_FOR_index) ( const Char*, Int ); extern void VG_(amd64_linux_SUBST_FOR_rt_sigreturn); extern void VG_(amd64_linux_REDIR_FOR_vgettimeofday); extern void VG_(amd64_linux_REDIR_FOR_vtime); +extern UInt VG_(amd64_linux_REDIR_FOR_strlen)( void* ); #endif #if defined(VGP_ppc32_linux)