aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2014-03-11 20:20:29 -0700
committerGuy Harris <guy@alum.mit.edu>2014-03-12 03:21:24 +0000
commite856d75fbc248f4f08084b69dc1c51851ca83183 (patch)
treea71ab615f98979bc5d4cbdf563ffec196c0efaa2
parent8a21c7ad27819caa370979b61168909e00b981b9 (diff)
downloadwireshark-e856d75fbc248f4f08084b69dc1c51851ca83183.tar.gz
wireshark-e856d75fbc248f4f08084b69dc1c51851ca83183.tar.bz2
wireshark-e856d75fbc248f4f08084b69dc1c51851ca83183.zip
Always have WS_DLL_PUBLIC include "extern".
This may fix some issues Albert Chin found on Solaris, which might be due to variables being defined, not just declared, in header files due to the lack of "extern". Done by backporting some changes from the trunk, but without renaming WS_DLL_PUBLIC_NOEXTERN to WS_DLL_PUBLIC_DEF, so that we don't have to change any other files. We also pick up comments from those changes. Change-Id: I6b0b9ee59a2379fca3279a17774f637b26f0b48d Reviewed-on: https://code.wireshark.org/review/611 Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r--ws_symbol_export.h85
1 files changed, 74 insertions, 11 deletions
diff --git a/ws_symbol_export.h b/ws_symbol_export.h
index 92a864b348..1903c4b649 100644
--- a/ws_symbol_export.h
+++ b/ws_symbol_export.h
@@ -51,33 +51,96 @@
/* 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. */
#ifdef WS_BUILD_DLL
+ /*
+ * Building a DLL; for all definitions, we want dllexport, and
+ * (presumably so source from DLL and source from a program using the
+ * DLL can both include a header that declares APIs and exported data
+ * for the DLL), for declarations, either dllexport or dllimport will
+ * work (they mean the same thing for a declaration when building a DLL).
+ */
#ifdef __GNUC__
-#define WS_DLL_PUBLIC __attribute__ ((dllexport))
+ /* GCC */
+#define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((dllexport))
#else /* ! __GNUC__ */
-#define WS_DLL_PUBLIC __declspec(dllexport) /* Note: actually gcc seems to also support this syntax. */
+ /*
+ * Presumably MSVC.
+ * Note: actually gcc seems to also support this syntax.
+ */
+#define WS_DLL_PUBLIC_NOEXTERN __declspec(dllexport)
#endif /* __GNUC__ */
- #else
+ #else /* WS_BUILD_DLL */
+ /*
+ * Building a program; we should only see declarations, not definitions,
+ * with WS_DLL_PUBLIC, and they all represent APIs or data imported
+ * from a DLL, so use dllimport.
+ *
+ * For functions, export shouldn't be necessary; for data, it might
+ * be necessary, e.g. if what's declared is an array whose size is
+ * not given in the declaration.
+ */
#ifdef __GNUC__
-#define WS_DLL_PUBLIC __attribute__ ((dllimport))
+ /* GCC */
+#define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((dllimport))
#elif ! (defined ENABLE_STATIC) /* ! __GNUC__ */
-#define WS_DLL_PUBLIC __declspec(dllimport) /* Note: actually gcc seems to also support this syntax. */
+ /*
+ * Presumably MSVC, and we're not building all-static.
+ * Note: actually gcc seems to also support this syntax.
+ */
+#define WS_DLL_PUBLIC_NOEXTERN __declspec(dllimport)
#else /* ! __GNUC__ && ENABLE_STATIC */
-#define WS_DLL_PUBLIC
+ /*
+ * Presumably MSVC, and we're building all-static, so we're
+ * not building any DLLs.
+ */
+#define WS_DLL_PUBLIC_NOEXTERN
#endif /* __GNUC__ */
#endif /* WS_BUILD_DLL */
- #define WS_DLL_PUBLIC_NOEXTERN WS_DLL_PUBLIC
+
+ /*
+ * Symbols in a DLL are *not* exported unless they're specifically
+ * flagged as exported, so, for a non-static but non-exported
+ * symbol, we don't have to do anything.
+ */
#define WS_DLL_LOCAL
-#else
+#else /* defined _WIN32 || defined __CYGWIN__ */
+ /*
+ * Compiling for UN*X, where the dllimport and dllexport stuff
+ * is neither necessary nor supported; just specify the
+ * visibility if we have a compiler that claims compatibility
+ * with GCC 4 or later.
+ */
#if __GNUC__ >= 4
-#define WS_DLL_PUBLIC __attribute__ ((visibility ("default"))) extern
+ /*
+ * Symbols exported from libraries.
+ */
#define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((visibility ("default")))
+
+ /*
+ * Non-static symbols *not* exported from libraries.
+ */
#define WS_DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else /* ! __GNUC__ >= 4 */
- #define WS_DLL_PUBLIC
+ /*
+ * We have no way to control visibility.
+ */
#define WS_DLL_PUBLIC_NOEXTERN
- #define WS_DLL_LOCAL extern
+ #define WS_DLL_LOCAL
#endif /* __GNUC__ >= 4 */
#endif
+/*
+ * You *must* use this for exported data *declarations*; if you use
+ * WS_DLL_PUBLIC_NOEXTERN, some compilers, such as MSVC++, will complain
+ * about array definitions with no size.
+ *
+ * You must *not* use this for exported data *definitions*, as that
+ * will, for some compilers, cause warnings about items being initialized
+ * and declared extern.
+ *
+ * Either can be used for exported *function* declarations and definitions.
+ */
+#define WS_DLL_PUBLIC WS_DLL_PUBLIC_NOEXTERN extern
+
#endif /* SYMBOL_EXPORT_H */