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
#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\")));
#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")));