]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 338703 helgrind on arm-linux gets false positives in dynamic loader.
authorMark Wielaard <mark@klomp.org>
Mon, 1 Sep 2014 15:29:55 +0000 (15:29 +0000)
committerMark Wielaard <mark@klomp.org>
Mon, 1 Sep 2014 15:29:55 +0000 (15:29 +0000)
There are a couple of issues with helgrind on arm-linux with glibc:

- Thread creation stack traces cannot unwind through clone
  (cfi ends right after syscall)
- ld.so has a special "hard float" name that isn't recognized as special
  (ld-linux-armhf.so.3)
- Races are found when manipulating GOT sections.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14407

NEWS
helgrind/hg_errors.c
helgrind/hg_main.c
include/pub_tool_redir.h

diff --git a/NEWS b/NEWS
index b68e71bca61f1d2ac7fc066acfc810180d11f1da..84df31f869654ee14c9a10e5bb81670fd1c2b2a6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -247,6 +247,7 @@ where XXXXXX is the bug number as listed below.
 338499  --sim-hints parsing broken due to wrong order in tokens
 338615  suppress glibc 2.20 optimized strcmp implementation for ARMv7
 338681  Unable to unwind through clone thread created on i386-linux
+338703  helgrind on arm-linux gets false positives in dynamic loader
 n-i-bz  Fix KVM_CREATE_IRQCHIP ioctl handling
 n-i-bz  s390x: Fix memory corruption for multithreaded applications
 n-i-bz  vex arm->IR: allow PC as basereg in some LDRD cases
index 321b2b7f37832ac2901594b28643956b493eb903..85c973cfc985725a15274f934ff4bb0dd5a3f578 100644 (file)
@@ -475,6 +475,8 @@ void HG_(record_error_Race) ( Thread* thr,
      if (sect == Vg_SectGOTPLT) return;
      /* SectPLT is required on ppc32/64-linux */
      if (sect == Vg_SectPLT) return;
+     /* SectGOT is required on arm-linux */
+     if (sect == Vg_SectGOT) return;
    }
 #  endif
 
index d2261e21768c70c363bd88c3aff1192dbd3806b3..46f64e3901635f8df549a101682f922f66e59b41 100644 (file)
@@ -1579,7 +1579,7 @@ void evh__pre_thread_ll_create ( ThreadId parent, ThreadId child )
       { Word first_ip_delta = 0;
 #       if defined(VGP_amd64_linux) || defined(VGP_x86_linux)
         first_ip_delta = -3;
-#       elif defined(VGP_arm64_linux)
+#       elif defined(VGP_arm64_linux) || defined(VGP_arm_linux)
         first_ip_delta = -1;
 #       endif
         thr_c->created_at = VG_(record_ExeContext)(parent, first_ip_delta);
@@ -4480,6 +4480,7 @@ static Bool is_in_dynamic_linker_shared_object( Addr64 ga )
    if (VG_STREQ(soname, VG_U_LD64_SO_2))            return True;
    if (VG_STREQ(soname, VG_U_LD_SO_1))              return True;
    if (VG_STREQ(soname, VG_U_LD_LINUX_AARCH64_SO_1)) return True;
+   if (VG_STREQ(soname, VG_U_LD_LINUX_ARMHF_SO_3))  return True;
 #  elif defined(VGO_darwin)
    if (VG_STREQ(soname, VG_U_DYLD)) return True;
 #  else
index b99ef2c584f867af3957d8fd79623275f21a8a13..f99ffb77e300908115379a607c4ec5a09478205d 100644 (file)
 #define  VG_U_LD_SO_1               "ld.so.1"
 
 #define  VG_U_LD_LINUX_AARCH64_SO_1 "ld-linux-aarch64.so.1"
+#define  VG_U_LD_LINUX_ARMHF_SO_3   "ld-linux-armhf.so.3"
 
 #endif