From f90e26cb4bffbef8c0b00b8774887963232c8b0a Mon Sep 17 00:00:00 2001 From: Boris Ranto Date: Tue, 3 Aug 2021 20:44:47 +0200 Subject: [PATCH] librados/librados_c: Use symver attribute if available Fixes: https://tracker.ceph.com/issues/40060 Signed-off-by: Boris Ranto --- cmake/modules/CephChecks.cmake | 7 +++++++ src/include/config-h.in.cmake | 3 +++ src/librados/librados_c.cc | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/cmake/modules/CephChecks.cmake b/cmake/modules/CephChecks.cmake index 634fa02a8ecfb..4317e4f4eec1d 100644 --- a/cmake/modules/CephChecks.cmake +++ b/cmake/modules/CephChecks.cmake @@ -148,6 +148,13 @@ endif(NOT CMAKE_CROSSCOMPILING) set(version_script_source "v1 { }; v2 { } v1;") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version_script.txt "${version_script_source}") cmake_push_check_state(RESET) +set(CMAKE_REQUIRED_FLAGS "-Werror=attribute -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/version_script.txt") +check_c_source_compiles(" +__attribute__((__symver__ (\"func@v1\"))) void func_v1() {}; +__attribute__((__symver__ (\"func@v2\"))) void func_v2() {}; + +int main() {}" + HAVE_ATTR_SYMVER) set(CMAKE_REQUIRED_FLAGS -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/version_script.txt) check_c_source_compiles(" void func_v1() {} diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index 167e8be41f816..01681c494612c 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -271,6 +271,9 @@ /* Define if the C compiler supports __PRETTY_FUNCTION__ */ #cmakedefine HAVE_PRETTY_FUNC +/* Define if the C compiler supports __attribute__((__symver__ (".."))) */ +#cmakedefine HAVE_ATTR_SYMVER + /* Define if the C compiler supports __asm__(".symver ..") */ #cmakedefine HAVE_ASM_SYMVER diff --git a/src/librados/librados_c.cc b/src/librados/librados_c.cc index 7bb912628240f..dd1723dd5eb33 100644 --- a/src/librados/librados_c.cc +++ b/src/librados/librados_c.cc @@ -44,15 +44,25 @@ #endif #ifdef HAVE_ASM_SYMVER +#ifdef HAVE_ATTR_SYMVER #define LIBRADOS_C_API_BASE(fn) \ extern __typeof (_##fn##_base) _##fn##_base __attribute__((__symver__ (#fn "@"))) #define LIBRADOS_C_API_BASE_DEFAULT(fn) \ extern __typeof (_##fn) _##fn __attribute__((__symver__ (#fn "@@"))) #define LIBRADOS_C_API_DEFAULT(fn, ver) \ extern __typeof (_##fn) _##fn __attribute__((__symver__ (#fn "@@LIBRADOS_" #ver))) +#else +#define LIBRADOS_C_API_BASE(fn) \ + asm(".symver _" #fn "_base, " #fn "@") +#define LIBRADOS_C_API_BASE_DEFAULT(fn) \ + asm(".symver _" #fn ", " #fn "@@") +#define LIBRADOS_C_API_DEFAULT(fn, ver) \ + asm(".symver _" #fn ", " #fn "@@LIBRADOS_" #ver) +#endif #define LIBRADOS_C_API_BASE_F(fn) _ ## fn ## _base #define LIBRADOS_C_API_DEFAULT_F(fn) _ ## fn + #else #define LIBRADOS_C_API_BASE(fn) #define LIBRADOS_C_API_BASE_DEFAULT(fn) -- 2.39.5