]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados/librados_c: Use symver attribute if available
authorBoris Ranto <branto@redhat.com>
Tue, 3 Aug 2021 18:44:47 +0000 (20:44 +0200)
committerBoris Ranto <branto@redhat.com>
Thu, 5 Aug 2021 13:46:50 +0000 (15:46 +0200)
Fixes: https://tracker.ceph.com/issues/40060
Signed-off-by: Boris Ranto <branto@redhat.com>
cmake/modules/CephChecks.cmake
src/include/config-h.in.cmake
src/librados/librados_c.cc

index 634fa02a8ecfbda1074ae8801244beedb761f01c..4317e4f4eec1ddba0b778de4d7537bf2304b0acb 100644 (file)
@@ -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() {}
index 167e8be41f8163c3dcd555e28f0e29bb391c0b52..01681c494612c5fc3a8dd1bb3f671c3240d2b8c5 100644 (file)
 /* 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
 
index 7bb912628240f2fdfc3762617df5b5eff17704c3..dd1723dd5eb33d7130ba5ac38a89a48a9afa8aab 100644 (file)
 #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)