summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2023-01-02 22:53:54 +0100
committerNikolaus Rath <Nikolaus@rath.org>2023-01-04 15:27:21 +0000
commit3736e0c85f4a8b624f6f1a27b736c18adbce9c15 (patch)
tree76cfcc05c6a150b1a738649d05887fd581df68bc
parentf212ec087037b5bb74700e6cce63c208bdbe8442 (diff)
downloadfuse-3736e0c85f4a8b624f6f1a27b736c18adbce9c15.tar.gz
convert __APPLE__ and __ULIBC__ to HAVE_LIBC_VERSIONED_SYMBOLS
In fact only gnu-libc fully supports symbol versioning, so it is better to have a generic macro for it. This also allows to manually disable symbol version and allows to run tests with that configuration on gnu-libc. That testing will still not catch compat issues, but least ensures the code can compile. Testing for __APPLE__ and __ULIBC__ is now done by meson. More of such checks can be added by people using other libcs.
-rw-r--r--include/fuse_lowlevel.h4
-rw-r--r--lib/compat.c2
-rw-r--r--lib/fuse_misc.h2
-rw-r--r--meson.build72
-rw-r--r--meson_options.txt3
5 files changed, 58 insertions, 25 deletions
diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h
index 53f0fcf..b76be71 100644
--- a/include/fuse_lowlevel.h
+++ b/include/fuse_lowlevel.h
@@ -1907,7 +1907,7 @@ struct fuse_cmdline_opts {
* @param opts output argument for parsed options
* @return 0 on success, -1 on failure
*/
-#if (!defined(__UCLIBC__) && !defined(__APPLE__))
+#if (defined(HAVE_LIBC_VERSIONED_SYMBOLS))
int fuse_parse_cmdline(struct fuse_args *args,
struct fuse_cmdline_opts *opts);
#else
@@ -1995,7 +1995,7 @@ int fuse_session_loop(struct fuse_session *se);
int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
#define fuse_session_loop_mt(se, config) fuse_session_loop_mt_32(se, config)
#else
- #if (!defined(__UCLIBC__) && !defined(__APPLE__))
+ #if (defined(HAVE_LIBC_VERSIONED_SYMBOLS))
/**
* Enter a multi-threaded event loop.
*
diff --git a/lib/compat.c b/lib/compat.c
index bdff5c9..6d4dece 100644
--- a/lib/compat.c
+++ b/lib/compat.c
@@ -34,7 +34,7 @@
/**
* Compatibility ABI symbol for systems that do not support version symboling
*/
-#if (defined(__UCLIBC__) || defined(__APPLE__))
+#if (!defined(HAVE_LIBC_VERSIONED_SYMBOLS))
/* With current libfuse fuse_parse_cmdline is a macro pointing to the
* versioned function. Here in this file we need to provide the ABI symbol
* and the redirecting macro is conflicting.
diff --git a/lib/fuse_misc.h b/lib/fuse_misc.h
index e2e9ba5..37e3635 100644
--- a/lib/fuse_misc.h
+++ b/lib/fuse_misc.h
@@ -15,7 +15,7 @@
Note: "@@" denotes the default symbol, "@" is binary a compat version.
*/
-#ifndef __APPLE__
+#ifdef HAVE_LIBC_VERSIONED_SYMBOLS
# if HAVE_SYMVER_ATTRIBUTE
# define FUSE_SYMVER(sym1, sym2) __attribute__ ((symver (sym2)))
# else
diff --git a/meson.build b/meson.build
index 3cef64f..c0acb37 100644
--- a/meson.build
+++ b/meson.build
@@ -60,10 +60,6 @@ cfg.set('HAVE_STRUCT_STAT_ST_ATIMESPEC',
prefix: include_default,
args: args_default))
-# Write the test results into config.h (stored in build directory)
-configure_file(output: 'config.h',
- configuration : cfg)
-
#
# Compiler configuration
#
@@ -90,30 +86,64 @@ if not cc.compiles(code, args: [ '-O0', '-Werror=unused-result' ])
add_project_arguments('-Wno-unused-result', language: 'c')
endif
-# gcc-10 and newer support the symver attribute which we need to use if we
-# want to support LTO
-# recent clang and gcc both support __has_attribute (and if they are too old
-# to have __has_attribute, then they are too old to support symver)
-# other compilers might not have __has_attribute, but in those cases
-# it is safe for this check to fail and for us to fallback to the old _asm_
-# method for symver. Anyway the attributes not supported by __has_attribute()
-# unfortunately return true giving a false positive. So let's try to build
-# using __attribute__ ((symver )) and see the result.
-code = '''
-__attribute__ ((symver ("test@TEST")))
-void foo(void) {
-}
+# It is hard to detect if the libc supports versioned symbols. Only gnu-libc
+# seems to provide that, but then glibc is the main target for libfuse, so
+# enable it by default
+versioned_symbols = 1
+# This is an attempt to detect if another libc is used.
+code = '''
int main(void) {
+#if (defined(__UCLIBC__) || defined(__APPLE__))
+#error /* libc does not have versioned symbols */
+#endif
return 0;
}'''
-if cc.compiles(code, args: [ '-O0', '-c', '-Werror'])
- message('Compiler supports symver attribute')
- add_project_arguments('-DHAVE_SYMVER_ATTRIBUTE', language: 'c')
+if not cc.compiles(code, args: [ '-O0' ])
+ versioned_symbols = 0
+endif
+
+# The detection can be overriden, which is useful for other (above unhandled)
+# libcs and also especially useful for testing
+if get_option('disable-libc-symbol-version')
+ versioned_symbols = 0
+endif
+
+if versioned_symbols == 1
+ message('Enabling versioned libc symbols')
+ cfg.set('HAVE_LIBC_VERSIONED_SYMBOLS', 1)
+
+ # gcc-10 and newer support the symver attribute which we need to use if we
+ # want to support LTO
+ # recent clang and gcc both support __has_attribute (and if they are too old
+ # to have __has_attribute, then they are too old to support symver)
+ # other compilers might not have __has_attribute, but in those cases
+ # it is safe for this check to fail and for us to fallback to the old _asm_
+ # method for symver. Anyway the attributes not supported by __has_attribute()
+ # unfortunately return true giving a false positive. So let's try to build
+ # using __attribute__ ((symver )) and see the result.
+ code = '''
+ __attribute__ ((symver ("test@TEST")))
+ void foo(void) {
+ }
+
+ int main(void) {
+ return 0;
+ }'''
+ if cc.compiles(code, args: [ '-O0', '-c', '-Werror'])
+ message('Compiler supports symver attribute')
+ add_project_arguments('-DHAVE_SYMVER_ATTRIBUTE', language: 'c')
+ else
+ message('Compiler does not support symver attribute')
+ endif
else
- message('Compiler does not support symver attribute')
+ message('Disabling versioned libc symbols')
endif
+# Write the test results into config.h (stored in build directory)
+configure_file(output: 'config.h',
+ configuration : cfg)
+
# '.' will refer to current build directory, which contains config.h
include_dirs = include_directories('include', 'lib', '.')
diff --git a/meson_options.txt b/meson_options.txt
index 891ccdf..fa4749c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -19,3 +19,6 @@ option('useroot', type : 'boolean', value : true,
option('tests', type : 'boolean', value : true,
description: 'Compile the test files')
+option('disable-libc-symbol-version', type : 'boolean', value : false,
+ description: 'Disable versioned symbols through libc')
+