| /// In glibc 2.32 new version of some symbols had been added [1]: |
| /// |
| /// $ nm -D clickhouse | fgrep -e @GLIBC_2.32 |
| /// U pthread_getattr_np@GLIBC_2.32 |
| /// U pthread_sigmask@GLIBC_2.32 |
| /// |
| /// [1]: https://www.spinics.net/lists/fedora-devel/msg273044.html |
| /// |
| /// Right now ubuntu 20.04 is used as official image for building |
| /// ClickHouse, however once it will be switched someone may not be happy |
| /// with that fact that he/she cannot use official binaries anymore because |
| /// they have glibc < 2.32. |
| /// |
| /// To avoid this dependency, let's force previous version of those |
| /// symbols from glibc. |
| /// |
| /// Also note, that the following approach had been tested: |
| /// a) -Wl,--wrap -- but it goes into endless recursion whey you try to do |
| /// something like this: |
| /// |
| /// int __pthread_getattr_np_compact(pthread_t thread, pthread_attr_t *attr); |
| /// GLIBC_COMPAT_SYMBOL(__pthread_getattr_np_compact, pthread_getattr_np) |
| /// int __pthread_getattr_np_compact(pthread_t thread, pthread_attr_t *attr); |
| /// int __wrap_pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) |
| /// { |
| /// return __pthread_getattr_np_compact(thread, attr); |
| /// } |
| /// |
| /// int __pthread_sigmask_compact(int how, const sigset_t *set, sigset_t *oldset); |
| /// GLIBC_COMPAT_SYMBOL(__pthread_sigmask_compact, pthread_sigmask) |
| /// int __pthread_sigmask_compact(int how, const sigset_t *set, sigset_t *oldset); |
| /// int __wrap_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) |
| /// { |
| /// return __pthread_sigmask_compact(how, set, oldset); |
| /// } |
| /// |
| /// b) -Wl,--defsym -- same problems (and you cannot use version of symbol with |
| /// version in the expression) |
| /// c) this approach -- simply add this file with -include directive. |
| |
| #if defined(__amd64__) |
| #define GLIBC_COMPAT_SYMBOL(func) __asm__(".symver " #func "," #func "@GLIBC_2.2.5"); |
| #elif defined(__aarch64__) |
| #define GLIBC_COMPAT_SYMBOL(func) __asm__(".symver " #func "," #func "@GLIBC_2.17"); |
| #else |
| #error Your platform is not supported. |
| #endif |
| |
| GLIBC_COMPAT_SYMBOL(pthread_sigmask) |
| GLIBC_COMPAT_SYMBOL(pthread_getattr_np) |