93 lines
3.5 KiB
Diff
93 lines
3.5 KiB
Diff
commit b39a5966a9e64d343b65d7678e4759aed6860bec
|
|
Author: mjw <mjw@a5019735-40e9-0310-863c-91ae7b9d1cf9>
|
|
Date: Wed Feb 24 11:12:01 2016 +0000
|
|
|
|
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 a5019735-40e9-0310-863c-91ae7b9d1cf9
|
|
|
|
diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c
|
|
index dcf1fb4..dae47f1 100644
|
|
--- a/coregrind/m_redir.c
|
|
+++ b/coregrind/m_redir.c
|
|
@@ -1353,6 +1353,9 @@ void VG_(redir_initialise) ( void )
|
|
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
|
|
diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S
|
|
index cac2288..176ea66 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 eda5ec6..1396519 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 005b679..8de085a 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)
|