]> git-server-git.apps.pok.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)
committerKefu Chai <tchaikov@gmail.com>
Wed, 31 Aug 2022 12:36:53 +0000 (20:36 +0800)
Fixes: https://tracker.ceph.com/issues/40060
Signed-off-by: Boris Ranto <branto@redhat.com>
(cherry picked from commit f90e26cb4bffbef8c0b00b8774887963232c8b0a)

cmake/modules/CephChecks.cmake
src/include/config-h.in.cmake
src/librados/librados_c.cc

index 6101426673d2643ff57f2ff0d8f10e4531a5d0fb..e46caf88274d5a007c57914460e594e03912a7ca 100644 (file)
@@ -147,6 +147,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 8ca934ab0b2d8ebdbb58042570f91531c151f66a..50c3f0bad685dab1b068fd16928e46ce89b4e19f 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 88dad8f6bd1df6d236884067e4193dcb5f4a8d6a..979dc10fd56358977201930b1139ece26d10a2b1 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)