avoid using ifunc + ASan
authorPhilip Pronin <philipp@fb.com>
Wed, 16 Oct 2013 07:01:53 +0000 (00:01 -0700)
committerSara Golemon <sgolemon@fb.com>
Thu, 24 Oct 2013 21:53:41 +0000 (14:53 -0700)
Summary:
Code that is using ifunc dies with SIGSEGV on startup when used
with ASan.

Here is gdb output: {P2882504}

Seems like `ifunc` dispatch is happening before ASan is initialized,
but ASan instrumentation logic being called from there.

Test Plan:
built affected unicorn binaries with ASan, ran them, verified
there is no more SIGSEGV

Reviewed By: meyering@fb.com

FB internal diff: D1013420

folly/Bits.cpp

index 15842b4571b6c4b80ffae997d90deec4f76a1064..76ceb0fa0fe5d16a08b7e9f33bd0378005c38bd0 100644 (file)
@@ -17,6 +17,7 @@
 #include "folly/Bits.h"
 
 #include "folly/CpuId.h"
+#include "folly/Portability.h"
 
 // None of this is necessary if we're compiling for a target that supports
 // popcnt
@@ -32,8 +33,7 @@ int popcountll_builtin(unsigned long long x) {
   return __builtin_popcountll(x);
 }
 
-
-#if FOLLY_HAVE_IFUNC
+#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS)
 
 // Strictly speaking, these versions of popcount are usable without ifunc
 // support. However, we would have to check, via CpuId, if the processor
@@ -63,7 +63,7 @@ extern "C" Type_popcountll* folly_popcountll_ifunc() {
   return folly::CpuId().popcnt() ?  popcountll_inst : popcountll_builtin;
 }
 
-#endif // FOLLY_HAVE_IFUNC
+#endif  // FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS)
 
 }  // namespace
 
@@ -73,7 +73,7 @@ namespace detail {
 // Call folly_popcount_ifunc on startup to resolve to either popcount_inst
 // or popcount_builtin
 int popcount(unsigned int x)
-#if FOLLY_HAVE_IFUNC
+#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS)
   __attribute__((ifunc("folly_popcount_ifunc")));
 #else
 {  return popcount_builtin(x); }
@@ -82,7 +82,7 @@ int popcount(unsigned int x)
 // Call folly_popcount_ifunc on startup to resolve to either popcountll_inst
 // or popcountll_builtin
 int popcountll(unsigned long long x)
-#if FOLLY_HAVE_IFUNC
+#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS)
   __attribute__((ifunc("folly_popcountll_ifunc")));
 #else
 {  return popcountll_builtin(x); }