From: Mark Wielaard Date: Wed, 24 Feb 2016 11:12:01 +0000 (+0000) Subject: Bug 359733 amd64 implement ld.so strchr/index override like x86 X-Git-Tag: svn/VALGRIND_3_12_0~211 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a8b65d1f20c33e02371f5475d391399ccb17780;p=thirdparty%2Fvalgrind.git Bug 359733 amd64 implement ld.so strchr/index override like x86 The suppression and redirection for ld.so strchr/index isn't needed for x86. When testing a newer glibc or calling the ld.so through an alternative path neither the suppression (doesn't match path/name) nor the redirection (triggers too late) works. Since there is already an hardwire override for strlen in amd64 ld.so anyway it makes sense to also hardware index (it is always called when ld.so loads the preload images). This was also explained in the easy hacks Fosdem session. See https://bugs.kde.org/show_bug.cgi?id=359733 for a pointer. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15812 --- diff --git a/NEWS b/NEWS index 9d4ed1ace0..a851aa48e9 100644 --- a/NEWS +++ b/NEWS @@ -76,6 +76,7 @@ where XXXXXX is the bug number as listed below. 359472 The Power PC vsubuqm instruction doesn't always give the correct result 359703 s390: wire up separate socketcalls system calls 359724 getsockname might crash - deref_UInt should call safe_to_deref +359733 amd64 implement ld.so strchr/index override like x86 n-i-bz Fix incorrect (or infinite loop) unwind on RHEL7 x86 and amd64 n-i-bz massif --pages-as-heap=yes does not report peak caused by mmap+munmap diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index dcf1fb45ff..dae47f1804 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -1352,6 +1352,9 @@ void VG_(redir_initialise) ( void ) the start, otherwise ld.so makes a lot of noise. */ if (0==VG_(strcmp)("Memcheck", VG_(details).name)) { + add_hardwired_spec( + "ld-linux-x86-64.so.2", "index", + (Addr)&VG_(amd64_linux_REDIR_FOR_index), NULL); add_hardwired_spec( "ld-linux-x86-64.so.2", "strlen", (Addr)&VG_(amd64_linux_REDIR_FOR_strlen), diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S index cac2288996..176ea6693c 100644 --- a/coregrind/m_trampoline.S +++ b/coregrind/m_trampoline.S @@ -220,6 +220,30 @@ VG_(amd64_linux_REDIR_FOR_strlen): .LfnE5: .size VG_(amd64_linux_REDIR_FOR_strlen), .-VG_(amd64_linux_REDIR_FOR_strlen) +.global VG_(amd64_linux_REDIR_FOR_index) +.type VG_(amd64_linux_REDIR_FOR_index), @function +VG_(amd64_linux_REDIR_FOR_index): + movzbl (%rdi), %eax + movl %esi, %edx + cmpb %sil, %al + jne .L4 + jmp .L5 +.L10: + addq $1, %rdi + movzbl (%rdi), %eax + cmpb %dl, %al + je .L5 +.L4: + testb %al, %al + jne .L10 + xorl %eax, %eax + ret +.L5: + movq %rdi, %rax + ret +.size VG_(amd64_linux_REDIR_FOR_index), .-VG_(amd64_linux_REDIR_FOR_index) + + /* A CIE for the above four functions, followed by their FDEs */ .section .eh_frame,"a",@progbits diff --git a/coregrind/pub_core_trampoline.h b/coregrind/pub_core_trampoline.h index eda5ec65ea..1396519e89 100644 --- a/coregrind/pub_core_trampoline.h +++ b/coregrind/pub_core_trampoline.h @@ -71,6 +71,7 @@ extern Addr VG_(amd64_linux_REDIR_FOR_vgettimeofday); extern Addr VG_(amd64_linux_REDIR_FOR_vtime); extern Addr VG_(amd64_linux_REDIR_FOR_vgetcpu); extern UInt VG_(amd64_linux_REDIR_FOR_strlen)( void* ); +extern Char* VG_(amd64_linux_REDIR_FOR_index) ( const Char*, Int ); #endif #if defined(VGP_ppc32_linux) diff --git a/shared/vg_replace_strmem.c b/shared/vg_replace_strmem.c index 005b6795a1..8de085a57b 100644 --- a/shared/vg_replace_strmem.c +++ b/shared/vg_replace_strmem.c @@ -247,7 +247,7 @@ static inline void my_exit ( int x ) STRCHR(VG_Z_LIBC_SONAME, __strchr_sse2) STRCHR(VG_Z_LIBC_SONAME, __strchr_sse2_no_bsf) STRCHR(VG_Z_LIBC_SONAME, index) -# if !defined(VGP_x86_linux) +# if !defined(VGP_x86_linux) && !defined(VGP_amd64_linux) STRCHR(VG_Z_LD_LINUX_SO_2, strchr) STRCHR(VG_Z_LD_LINUX_SO_2, index) STRCHR(VG_Z_LD_LINUX_X86_64_SO_2, strchr)