Pick up stuff from GLib to hide symbols with Sun C.

Note why we don't use G_GNUC_INTERNAL, but duplicate what GLib does, and
don't use G_HAVE_GNUC_VISIBILITY to determine whether we can use
__attribute__ ((visibility (...))).

Change-Id: I0b8d40f40d04e821352522320626173806787214
Reviewed-on: https://code.wireshark.org/review/2753
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2014-07-01 12:21:02 -07:00
parent 2211813e21
commit 27d320112e
1 changed files with 37 additions and 2 deletions

View File

@ -47,6 +47,29 @@
#ifndef SYMBOL_EXPORT_H
#define SYMBOL_EXPORT_H
/*
* NOTE: G_HAVE_GNUC_VISIBILITY is defined only if all of
*
* __attribute__ ((visibility ("hidden")))
*
* __attribute__ ((visibility ("internal")))
*
* __attribute__ ((visibility ("protected")))
*
* __attribute__ ((visibility ("default")))
*
* are supported, and at least some versions of GCC from Apple support
* "default" and "hidden" but not "internal" or "protected", so it
* shouldn't be used to determine whether "hidden" or "default" is
* supported.
*
* This also means that we shouldn't use G_GNUC_INTERNAL instead of
* WS_DLL_LOCAL, as GLib uses G_HAVE_GNUC_VISIBILITY to determine
* whether to use __attribute__ ((visibility ("hidden"))) for
* G_GNUC_INTERNAL, and that will not use it even with compilers
* that support it.
*/
/* Originally copied from GCC Wiki at http://gcc.gnu.org/wiki/Visibility */
#if defined _WIN32 || defined __CYGWIN__
/* Compiling for Windows, so we use the Windows DLL declarations. */
@ -121,10 +144,22 @@
#define WS_DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else /* ! __GNUC__ >= 4 */
/*
* We have no way to control visibility.
* We have no way to make stuff not explicitly marked as
* visible invisible outside a library, but we might have
* a way to make stuff explicitly marked as local invisible
* outside the library.
*
* This was lifted from GLib; see above for why we don't use
* G_GNUC_INTERNAL.
*/
#define WS_DLL_PUBLIC_DEF
#define WS_DLL_LOCAL
#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
#define WS_DLL_LOCAL __attribute__ ((visibility ("hidden")))
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
#define WS_DLL_LOCAL __hidden
#else /* not Sun C with "hidden" support */
#define WS_DLL_LOCAL
#endif
#endif /* __GNUC__ >= 4 */
#endif