[Libguestfs] [PATCH nbdkit v2 2/3] NOT WORKING: vddk: Drive library loading from libdir parameter.
Eric Blake
eblake at redhat.com
Thu Feb 13 16:24:45 UTC 2020
On 2/13/20 10:04 AM, Richard W.M. Jones wrote:
> I couldn't get this to work in the end. This is the latest
> non-working version. This email documents what doesn't work for the
> permanent record.
>
> The central problem is that VDDK InitEx() appears to dlopen() various
> of its own plugins. Although I wasn't able to capture exactly what
> dlopen() command it is running, the plugins cannot be loaded because
> they rely on the recompiled system libraries (libcrypto.so.X etc) and
> it cannot find those because $LD_LIBRARY_PATH is not set.
>
> Setting $LD_LIBRARY_PATH using setenv around the call to InitEx() does
> not work because glibc only consults $LD_LIBRARY_PATH when the program
> starts up. Various workarounds have been suggested for this but none
> of them are pleasant
> (https://stackoverflow.com/questions/6713692/problems-with-using-setenv-and-then-making-the-dlopen-call).
>
> So currently we must have nbdkit start up with $LD_LIBRARY_PATH set,
> in other words how it works at the moment.
Here's my rough [untested] idea, after reading
https://hackerboss.com/overriding-system-functions-for-fun-and-profit/.
Create a shim shared library that implements only one function - a
replacement dlopen(), something like:
#define _GNU_SOURCE
#include <dlfcn.h>
void *(*orig_dlopen)(const char *filename, int flags);
/* NULL for normal behavior, or set when we want to override
* relative dlopen()s to instead be an absolute open with prefix.
*/
char *override_dir;
void *dlopen(const char *filename, int flags)
{
if (override_dir && !strchr(filename, '/'))
... code to rewrite filename into override_dir/filename
return orig_dlopen (filename, flags);
}
void
_init(void)
{
orig_dlopen = dlsym(RTLD_NEXT, "dlopen");
}
then in our vddk plugin, we dlmopen(LM_ID_NEWLM, "shim", flags) to
create a new namespace, dlinfo() to learn the id of that namespace, then
override_dir = libdir; dlmopen(id, "vddk", flags) so that vddk gets
loaded into that same namespace but where all of its relative loads get
rewritten into absolute loads.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
More information about the Libguestfs
mailing list