From: Philip Pronin Date: Wed, 16 Oct 2013 07:01:53 +0000 (-0700) Subject: avoid using ifunc + ASan X-Git-Tag: v0.22.0~813 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=681e46770a9045f8c9c98ae13d3f6205f2be6c85;p=folly.git avoid using ifunc + ASan 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 --- diff --git a/folly/Bits.cpp b/folly/Bits.cpp index 15842b45..76ceb0fa 100644 --- a/folly/Bits.cpp +++ b/folly/Bits.cpp @@ -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); }