Bug 359733 - amd64 implement strchr/index override to avoid need for suppression and redirection like x86
Summary: amd64 implement strchr/index override to avoid need for suppression and redir...
Status: RESOLVED FIXED
Alias: None
Product: valgrind
Classification: Developer tools
Component: general (show other bugs)
Version: unspecified
Platform: Other Linux
: NOR normal
Target Milestone: ---
Assignee: Julian Seward
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-02-23 23:58 UTC by Mark Wielaard
Modified: 2016-02-24 11:17 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mark Wielaard 2016-02-23 23:58:02 UTC
This was suggested about a year ago in the Fosdem easy hacks presentation:
https://archive.fosdem.org/2015/schedule/event/valgrind_easy_hack/attachments/slides/731/export/events/attachments/valgrind_easy_hack/slides/731/valgrind_easy_hacks.html#slide16

The suppression and redirection 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 it makes sense to also hardware index (it is always called when ld.so loads the preload images)

Reproducible: Always




Suggested patch:

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)
Comment 1 Mark Wielaard 2016-02-24 11:17:55 UTC
valgrind svn r15812