]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
Build: Require attribute no_profile_instrument_function for ifunc usage.
authorJia Tan <jiat0218@gmail.com>
Mon, 4 Mar 2024 16:27:31 +0000 (00:27 +0800)
committerJia Tan <jiat0218@gmail.com>
Mon, 4 Mar 2024 17:54:30 +0000 (01:54 +0800)
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

CMakeLists.txt
configure.ac

index b45002d8396a0cc0a06d59fbfb0513686a40f00c..3b616b5c1c7cb946e1292dead4d3b7f03c0dd07f 100644 (file)
@@ -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\")));
index 446e26e2b79014b339763448130bd7ffc36916d3..176bb9ce0a9dddf40496d712c329ebd90cf011eb 100644 (file)
@@ -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")));