Bug 338703 helgrind on arm-linux gets false positives in dynamic loader.

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
This commit is contained in:
Mark Wielaard 2014-09-01 15:29:55 +00:00
parent 3f47256593
commit a93b787140
4 changed files with 6 additions and 1 deletions

1
NEWS
View File

@ -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

View 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

View 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

View File

@ -302,6 +302,7 @@
#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