This patch ensures that the gl_get_setlocale_null_lock function gets exported from shared libraries (such as libintl.so) also on ELF systems, so that different shared libraries attached to the same process use the same lock.
2019-12-23 Bruno Haible <br...@clisp.org> setlocale-null: Export the lock function also on non-Windows platforms. * lib/setlocale-lock.c (DLL_EXPORTED): New macro. (gl_get_setlocale_null_lock): Declare as DLL_EXPORTED. * m4/setlocale_null.m4 (gl_PREREQ_SETLOCALE_LOCK): New macro. * modules/setlocale-null (configure.ac): Invoke it. (Files): Add m4/visibility.m4. diff --git a/lib/setlocale-lock.c b/lib/setlocale-lock.c index 9c47afc..60c1ba3 100644 --- a/lib/setlocale-lock.c +++ b/lib/setlocale-lock.c @@ -25,6 +25,19 @@ /* Prohibit renaming this symbol. */ #undef gl_get_setlocale_null_lock +/* Macro for exporting a symbol (function, not variable) defined in this file, + when compiled into a shared library. */ +#ifndef DLL_EXPORTED +# if HAVE_VISIBILITY + /* Override the effect of the compiler option '-fvisibility=hidden'. */ +# define DLL_EXPORTED __attribute__((__visibility__("default"))) +# elif defined _WIN32 || defined __CYGWIN__ +# define DLL_EXPORTED __declspec(dllexport) +# else +# define DLL_EXPORTED +# endif +#endif + #if defined _WIN32 && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ @@ -36,7 +49,7 @@ because the latter is not guaranteed to be a stable ABI in the future. */ /* Make sure the function gets exported from DLLs. */ -__declspec(dllexport) CRITICAL_SECTION *gl_get_setlocale_null_lock (void); +DLL_EXPORTED CRITICAL_SECTION *gl_get_setlocale_null_lock (void); static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT; static CRITICAL_SECTION lock; @@ -72,10 +85,8 @@ gl_get_setlocale_null_lock (void) static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -# if defined _WIN32 || defined __CYGWIN__ -/* Make sure the function gets exported from DLLs. */ -__declspec(dllexport) pthread_mutex_t *gl_get_setlocale_null_lock (void); -# endif +/* Make sure the function gets exported from shared libraries. */ +DLL_EXPORTED pthread_mutex_t *gl_get_setlocale_null_lock (void); /* Returns the internal lock used by setlocale_null_r. */ pthread_mutex_t * @@ -101,6 +112,9 @@ atomic_init (void) init_needed = 0; } +/* Make sure the function gets exported from shared libraries. */ +DLL_EXPORTED mtx_t *gl_get_setlocale_null_lock (void); + /* Returns the internal lock used by setlocale_null_r. */ mtx_t * gl_get_setlocale_null_lock (void) diff --git a/m4/setlocale_null.m4 b/m4/setlocale_null.m4 index eff6e76..465ef11 100644 --- a/m4/setlocale_null.m4 +++ b/m4/setlocale_null.m4 @@ -90,3 +90,9 @@ AC_DEFUN([gl_FUNC_SETLOCALE_NULL], dnl with gcc or xlc, and empty otherwise. AC_SUBST([LIB_SETLOCALE_NULL]) ]) + +# Prerequisites of lib/setlocale-lock.c. +AC_DEFUN([gl_PREREQ_SETLOCALE_LOCK], +[ + gl_VISIBILITY +]) diff --git a/modules/setlocale-null b/modules/setlocale-null index 5240369..2774004 100644 --- a/modules/setlocale-null +++ b/modules/setlocale-null @@ -8,6 +8,7 @@ lib/setlocale-lock.c lib/windows-initguard.h m4/setlocale_null.m4 m4/threadlib.m4 +m4/visibility.m4 Depends-on: locale @@ -17,6 +18,7 @@ configure.ac: gl_FUNC_SETLOCALE_NULL if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then AC_LIBOBJ([setlocale-lock]) + gl_PREREQ_SETLOCALE_LOCK fi gl_LOCALE_MODULE_INDICATOR([setlocale_null])