Skip to content

Commit

Permalink
Don't finalize libraries in static build
Browse files Browse the repository at this point in the history
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>.
  • Loading branch information
greghudson committed Dec 12, 2012
1 parent 26481ee commit 4538146
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/include/k5-platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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."
Expand Down

0 comments on commit 4538146

Please sign in to comment.