We previously added "-z nodelete" to the build of libvirt.so to prevent
crashes when thread local destructors run which point to a code that
has been dlclose()d:
commit
8e44e5593eb9b89fbc0b54fde15f130707a0d81e
Author: Daniel P. Berrange <berrange@redhat.com>
Date: Thu Sep 1 17:57:06 2011 +0100
Prevent crash from dlclose() of libvirt.so
The libvirtd loadable modules can suffer from the same problem if they
were ever unloaded. Fortunately we don't ever call dlclose() on them,
but lets add a second layer of protection by linking them with the
"-z nodelete" flag. While we're doing this, lets add a third layer of
protection by passing RTLD_NODELETE to dlopen().
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
$(CYGWIN_EXTRA_LDFLAGS) \
$(MINGW_EXTRA_LDFLAGS) \
$(NULL)
-AM_LDFLAGS_MOD = -module -avoid-version $(AM_LDFLAGS)
+AM_LDFLAGS_MOD = \
+ -module \
+ -avoid-version \
+ $(LIBVIRT_NODELETE) \
+ $(AM_LDFLAGS)
AM_LDFLAGS_MOD_NOUNDEF = $(AM_LDFLAGS_MOD) $(NO_UNDEFINED_LDFLAGS)
POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
virDriverLoadModuleFile(const char *file)
{
void *handle = NULL;
+ int flags = RTLD_NOW | RTLD_GLOBAL;
+
+# ifdef RTLD_NODELETE
+ flags |= RTLD_NODELETE;
+# endif
VIR_DEBUG("Load module file '%s'", file);
virUpdateSelfLastChanged(file);
- if (!(handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL)))
+ if (!(handle = dlopen(file, flags)))
VIR_ERROR(_("failed to load module %s %s"), file, dlerror());
return handle;