aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJia Tan <jiat0218@gmail.com>2024-03-05 00:27:31 +0800
committerJia Tan <jiat0218@gmail.com>2024-03-05 00:27:31 +0800
commited957d39426695e948b06de0ed952a2fbbe84bd1 (patch)
tree79c273cacc7601ab631eb834ea73bc17ee50666c
parentliblzma: Fix a comment in the RISC-V filter. (diff)
downloadxz-ed957d39426695e948b06de0ed952a2fbbe84bd1.tar.xz
Build: Require attribute no_profile_instrument_function for ifunc usage.
Using __attribute__((__no_profile_instrument_function__)) on the ifunc resolver works around a bug in GCC -fprofile-generate: it adds profiling code even to ifunc resolvers which can make the ifunc resolver crash at program startup. This attribute was not introduced until GCC 7 and Clang 13, so ifunc won't be used with prior versions of these compilers. This bug was brought to our attention by: https://bugs.gentoo.org/925415 And was reported to upstream GCC by: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11411
-rw-r--r--CMakeLists.txt7
-rw-r--r--configure.ac7
2 files changed, 14 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b45002d8..3b616b5c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1082,6 +1082,13 @@ if(USE_ATTR_IFUNC STREQUAL "auto")
#endif
static void func(void) { return; }
+
+ /*
+ * The attribute __no_profile_instrument_function__ is
+ * needed with GCC to prevent improper instrumentation in
+ * the ifunc resolver.
+ */
+ __attribute__((__no_profile_instrument_function__))
static void (*resolve_func(void)) (void) { return func; }
void func_ifunc(void)
__attribute__((__ifunc__(\"resolve_func\")));
diff --git a/configure.ac b/configure.ac
index 446e26e2..176bb9ce 100644
--- a/configure.ac
+++ b/configure.ac
@@ -915,6 +915,13 @@ if test "x$enable_ifunc" = xauto ; then
#endif
static void func(void) { return; }
+
+ /*
+ * The attribute __no_profile_instrument_function__ is
+ * needed with GCC to prevent improper instrumentation in
+ * the ifunc resolver.
+ */
+ __attribute__((__no_profile_instrument_function__))
static void (*resolve_func (void)) (void) { return func; }
void func_ifunc (void)
__attribute__((__ifunc__("resolve_func")));