[PATCH] D43669: [cfi] Lazy CFI initialization

Vitaly Buka via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 23 15:28:28 PST 2018


vitalybuka updated this revision to Diff 135717.
vitalybuka added a comment.

rename


https://reviews.llvm.org/D43669

Files:
  compiler-rt/lib/cfi/cfi.cc


Index: compiler-rt/lib/cfi/cfi.cc
===================================================================
--- compiler-rt/lib/cfi/cfi.cc
+++ compiler-rt/lib/cfi/cfi.cc
@@ -379,6 +379,8 @@
 }
 #endif
 
+static void EnsureInterceptorsInitialized();
+
 // Setup shadow for dlopen()ed libraries.
 // The actual shadow setup happens after dlopen() returns, which means that
 // a library can not be a target of any CFI checks while its constructors are
@@ -388,19 +390,35 @@
 // We could insert a high-priority constructor into the library, but that would
 // not help with the uninstrumented libraries.
 INTERCEPTOR(void*, dlopen, const char *filename, int flag) {
+  EnsureInterceptorsInitialized();
   EnterLoader();
   void *handle = REAL(dlopen)(filename, flag);
   ExitLoader();
   return handle;
 }
 
 INTERCEPTOR(int, dlclose, void *handle) {
+  EnsureInterceptorsInitialized();
   EnterLoader();
   int res = REAL(dlclose)(handle);
   ExitLoader();
   return res;
 }
 
+static atomic_uint8_t interceptors_inited = {0};
+
+static void EnsureInterceptorsInitialized() {
+  // This check allows redundant initializations. This is acceptable as
+  // INTERCEPT_FUNCTION is expected to save same value.
+  if (atomic_load(&interceptors_inited, memory_order_acquire))
+    return;
+
+  INTERCEPT_FUNCTION(dlopen);
+  INTERCEPT_FUNCTION(dlclose);
+
+  atomic_store(&interceptors_inited, 1, memory_order_release);
+}
+
 extern "C" SANITIZER_INTERFACE_ATTRIBUTE
 #if !SANITIZER_CAN_USE_PREINIT_ARRAY
 // On ELF platforms, the constructor is invoked using .preinit_array (see below)
@@ -411,9 +429,6 @@
   InitializeFlags();
   InitShadow();
 
-  INTERCEPT_FUNCTION(dlopen);
-  INTERCEPT_FUNCTION(dlclose);
-
 #ifdef CFI_ENABLE_DIAG
   __ubsan::InitAsPlugin();
 #endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43669.135717.patch
Type: text/x-patch
Size: 1759 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180223/a0f2bd91/attachment.bin>


More information about the llvm-commits mailing list