Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

gcc 5.3 version of libasan is broken



I found two problems on libasan of gcc 5.3.

(1) build fails on arm:

http://releng.netbsd.org/builds/HEAD/201606061330Z/

As we use dwarf EH, we must disable __arm__ specific codes in
sanitizer_unwind_posix_libcdep.cc, cf. gcc.old version of
sanitizer_netbsd.cc:

  https://nxr.netbsd.org/xref/src/external/gpl3/gcc.old/dist/libsanitizer/sanitizer_common/sanitizer_netbsd.cc#393

(2) binaries compiled with -fsanitize=address receive SEGV_MAPERR on
32bit big-endian machines. This is because the original code assumes
32bit little-endian or 64bit environments in sanitizer_linux.cc;
return values of internal_syscall(SYSCALL(mmap), ...) == __syscall(
SYS_mmap, ...) are quad_t == int64_t. Therefore, we need a special
care for 32bit big-endian machines to extract the mapped address.
The arguments for mmap are also reordered for ours.

Please apply the attached patch, which was tested on evbearmv7hf-eb.
It works also on amd64 and i386. I will send a PR if necessary.

Thanks,
Rin

--- src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_unwind_posix_libcdep.cc.orig	2016-06-07 03:02:26.599568511 +0900
+++ src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_unwind_posix_libcdep.cc	2016-06-07 03:02:51.632737172 +0900
@@ -71,7 +71,8 @@
 }
 #endif
-#ifdef __arm__
+#if defined(__arm__) && !SANITIZER_NETBSD
+// NetBSD uses dwarf EH
 #define UNWIND_STOP _URC_END_OF_STACK
 #define UNWIND_CONTINUE _URC_NO_REASON
 #else
@@ -80,7 +81,7 @@
 #endif
uptr Unwind_GetIP(struct _Unwind_Context *ctx) {
-#ifdef __arm__
+#if defined(__arm__) && !SANITIZER_NETBSD
   uptr val;
   _Unwind_VRS_Result res = _Unwind_VRS_Get(ctx, _UVRSC_CORE,
       15 /* r15 = PC */, _UVRSD_UINT32, &val);
--- src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cc.orig	2016-06-07 03:02:26.596812764 +0900
+++ src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cc	2016-06-07 04:19:50.028342374 +0900
@@ -101,7 +101,12 @@
 // --------------- sanitizer_libc.h
 uptr internal_mmap(void *addr, uptr length, int prot, int flags,
                     int fd, u64 offset) {
-#if SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX_USES_64BIT_SYSCALLS
+#if SANITIZER_NETBSD
+  s64 s = internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,
+			   (long)0, offset);
+  uptr *p = (uptr *)&s;
+  return *p;
+#elif SANITIZER_FREEBSD || SANITIZER_LINUX_USES_64BIT_SYSCALLS
   return internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,
                           offset, 0);
 #else


Home | Main Index | Thread Index | Old Index