提交 71feef92 编写于 作者: D Daniel P. Berrangé

build: prevent unloading of dlopen'd modules

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 8e44e559
  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: NDaniel P. Berrangé <berrange@redhat.com>
上级 078c80b6
......@@ -51,7 +51,11 @@ AM_LDFLAGS = $(DRIVER_MODULES_LDFLAGS) \
$(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)"
......
......@@ -45,6 +45,11 @@ static void *
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);
......@@ -55,7 +60,7 @@ virDriverLoadModuleFile(const char *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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册