|
From: <sv...@va...> - 2016-02-24 11:12:09
|
Author: mjw Date: Wed Feb 24 11:12:01 2016 New Revision: 15812 Log: 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. Modified: trunk/NEWS trunk/coregrind/m_redir.c trunk/coregrind/m_trampoline.S trunk/coregrind/pub_core_trampoline.h trunk/shared/vg_replace_strmem.c Modified: trunk/NEWS ============================================================================== --- trunk/NEWS (original) +++ trunk/NEWS Wed Feb 24 11:12:01 2016 @@ -76,6 +76,7 @@ 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 Modified: trunk/coregrind/m_redir.c ============================================================================== --- trunk/coregrind/m_redir.c (original) +++ trunk/coregrind/m_redir.c Wed Feb 24 11:12:01 2016 @@ -1353,6 +1353,9 @@ 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), # ifndef GLIBC_MANDATORY_STRLEN_REDIRECT Modified: trunk/coregrind/m_trampoline.S ============================================================================== --- trunk/coregrind/m_trampoline.S (original) +++ trunk/coregrind/m_trampoline.S Wed Feb 24 11:12:01 2016 @@ -220,6 +220,30 @@ .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 Modified: trunk/coregrind/pub_core_trampoline.h ============================================================================== --- trunk/coregrind/pub_core_trampoline.h (original) +++ trunk/coregrind/pub_core_trampoline.h Wed Feb 24 11:12:01 2016 @@ -71,6 +71,7 @@ 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) Modified: trunk/shared/vg_replace_strmem.c ============================================================================== --- trunk/shared/vg_replace_strmem.c (original) +++ trunk/shared/vg_replace_strmem.c Wed Feb 24 11:12:01 2016 @@ -247,7 +247,7 @@ 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) |