]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Don't finalize libraries in static build
authorGreg Hudson <ghudson@mit.edu>
Tue, 11 Dec 2012 19:36:06 +0000 (14:36 -0500)
committerGreg Hudson <ghudson@mit.edu>
Wed, 12 Dec 2012 07:08:45 +0000 (02:08 -0500)
In a build with static libraries, functions tagged with
__attribute__((destructor)) may be executed in any order, not in a
topologically sorted order as they are in shared libraries.  This
could result in libcom_err functions being invoked (from another
library's finalizer) after libcom_err has been finalized, which would
(at minimum) result in using a mutex after it is destroyed.  To
prevent this kind of problem, disable finalizers in the static build
regardless of whether we have compiler or linker support for them.
Reported by Mihai Serban <mihai.serban@gmail.com>.

src/include/k5-platform.h

index e4c33921821e00f677d74c317ea34a8b633c8822..f4021da71fc32050794ed60c621c206ee8728d12 100644 (file)
@@ -347,7 +347,19 @@ typedef struct { int error; unsigned char did_run; } k5_init_t;
 
 
 
-#if defined(USE_LINKER_FINI_OPTION) || defined(_WIN32)
+#if !defined(SHARED)
+
+/*
+ * In this case, we just don't care about finalization.
+ *
+ * The code will still define the function, but we won't do anything
+ * with it.  Annoying: This may generate unused-function warnings.
+ */
+
+# define MAKE_FINI_FUNCTION(NAME)               \
+        static void NAME(void)
+
+#elif defined(USE_LINKER_FINI_OPTION) || defined(_WIN32)
 /* If we're told the linker option will be used, it doesn't really
    matter what compiler we're using.  Do it the same way
    regardless.  */
@@ -391,16 +403,6 @@ typedef struct { int error; unsigned char did_run; } k5_init_t;
 # define MAKE_FINI_FUNCTION(NAME)       \
         static void NAME(void) __attribute__((destructor))
 
-#elif !defined(SHARED)
-
-/* In this case, we just don't care about finalization.
-
-   The code will still define the function, but we won't do anything
-   with it.  Annoying: This may generate unused-function warnings.  */
-
-# define MAKE_FINI_FUNCTION(NAME)       \
-        static void NAME(void)
-
 #else
 
 # error "Don't know how to do unload-time finalization for this configuration."