diff options
author | Jia Tan <jiat0218@gmail.com> | 2024-03-05 00:27:31 +0800 |
---|---|---|
committer | Jia Tan <jiat0218@gmail.com> | 2024-03-05 00:27:31 +0800 |
commit | ed957d39426695e948b06de0ed952a2fbbe84bd1 (patch) | |
tree | 79c273cacc7601ab631eb834ea73bc17ee50666c /CMakeLists.txt | |
parent | liblzma: Fix a comment in the RISC-V filter. (diff) | |
download | xz-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
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 7 |
1 files changed, 7 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\"))); |