[PATCH] D48806: [asan] Fix deadlock issue on FreeBSD, caused by use of .preinit_array in rL325240
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 30 13:27:58 PDT 2018
MaskRay created this revision.
Herald added subscribers: Sanitizers, llvm-commits, delcypher, krytarowski, kubamracek, srhines.
Without this patch,
clang -fsanitize=address a.c; ./a => deadlock in AsanTSDInit>pthread_key_create at PLT
Repository:
rCRT Compiler Runtime
https://reviews.llvm.org/D48806
Files:
lib/sanitizer_common/sanitizer_internal_defs.h
Index: lib/sanitizer_common/sanitizer_internal_defs.h
===================================================================
--- lib/sanitizer_common/sanitizer_internal_defs.h
+++ lib/sanitizer_common/sanitizer_internal_defs.h
@@ -98,10 +98,14 @@
// We can use .preinit_array section on Linux to call sanitizer initialization
// functions very early in the process startup (unless PIC macro is defined).
+//
+// On FreeBSD, .preinit_array functions are called with rtld_bind_lock writer
+// lock held. It will lead to dead lock if unresolved PLT functions (which helds
+// rtld_bind_lock reader lock) are called inside .preinit_array functions.
+//
// FIXME: do we have anything like this on Mac?
#ifndef SANITIZER_CAN_USE_PREINIT_ARRAY
-#if ((SANITIZER_LINUX && !SANITIZER_ANDROID) || \
- SANITIZER_FREEBSD || SANITIZER_OPENBSD) && !defined(PIC)
+#if ((SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_OPENBSD) && !defined(PIC)
# define SANITIZER_CAN_USE_PREINIT_ARRAY 1
// Before Solaris 11.4, .preinit_array is fully supported only with GNU ld.
// FIXME: Check for those conditions.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48806.153634.patch
Type: text/x-patch
Size: 1096 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180630/c7403acb/attachment.bin>
More information about the llvm-commits
mailing list