[Libguestfs] [PATCH nbdkit 5/9 patch split 1/5] Create libnbdkit.so.

Eric Blake eblake at redhat.com
Thu Mar 26 21:26:11 UTC 2020


On 3/26/20 3:13 PM, Richard W.M. Jones wrote:
> Currently it does nothing.

and does it well :)

> ---
>   configure.ac       |  1 +
>   Makefile.am        |  1 +
>   lib/Makefile.am    | 71 ++++++++++++++++++++++++++++++++++++++++++++++
>   server/Makefile.am |  3 ++
>   server/internal.h  |  1 +
>   lib/lib.h          | 48 +++++++++++++++++++++++++++++++
>   lib/init.c         | 53 ++++++++++++++++++++++++++++++++++
>   wrapper.c          | 18 ++++++++----
>   lib/libnbdkit.syms | 47 ++++++++++++++++++++++++++++++
>   9 files changed, 237 insertions(+), 6 deletions(-)
> 

> +++ b/lib/Makefile.am
> @@ -0,0 +1,71 @@

> +EXTRA_DIST = libnbdkit.syms
> +
> +# Note this library always has soname “libnbdkit.so.0” because plugins
> +# which may link to this library must forever have a stable soname.
> +# However the library only works with the corresponding nbdkit server
> +# binary compiled at the same time.  The two must be shipped together.
> +
> +lib_LTLIBRARIES = libnbdkit.la
> +libnbdkit_la_SOURCES = \
> +	init.c \
> +	lib.h \
> +	$(NULL)
> +
> +libnbdkit_la_CPPFLAGS = \
> +	-I$(top_srcdir)/include \
> +	-I$(top_srcdir)/common/include \
> +	-I$(top_srcdir)/common/utils \
> +	-DIN_NBDKIT_LIB=1 \
> +	$(NULL)
> +libnbdkit_la_CFLAGS = \
> +	$(PTHREAD_CFLAGS) \
> +	$(WARNINGS_CFLAGS) \
> +	$(NULL)
> +libnbdkit_la_LDFLAGS = \
> +	$(PTHREAD_LIBS) \
> +	$(NULL)
> +libnbdkit_la_LIBADD = \
> +	$(top_builddir)/common/utils/libutils.la \
> +	$(NULL)
> +
> +if USE_LINKER_SCRIPT_FOR_SERVER
> +# We have to disable the linker script for libFuzzer because Clang
> +# adds loads of fuzzer and ASAN-related symbols that are required by
> +# the plugins but which our linker script tries to hide.
> +if !ENABLE_LIBFUZZER
> +libnbdkit_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libnbdkit.syms
> +endif

I don't know if you tested libfuzzer, but assume that you'll either test 
that before pushing this, or have some followup patches as needed.

> +endif

When nesting Makefile.am conditionals, I like to supply the condition on 
the endif line to make it easier to track things.  Then again, we aren't 
consistent on whether we do that in our other Makefile.am.

> diff --git a/server/Makefile.am b/server/Makefile.am
> index 4c789934..ad0de9b1 100644
> --- a/server/Makefile.am
> +++ b/server/Makefile.am
> @@ -80,6 +80,7 @@ nbdkit_CPPFLAGS = \
>   	-Dfilterdir=\"$(filterdir)\" \
>   	-Dsbindir=\"$(sbindir)\" \
>   	-Dsysconfdir=\"$(sysconfdir)\" \
> +	-I$(top_srcdir)/lib \
>   	-I$(top_srcdir)/include \
>   	-I$(top_srcdir)/common/include \
>   	-I$(top_srcdir)/common/protocol \
> @@ -93,6 +94,7 @@ nbdkit_CFLAGS = \
>   	$(VALGRIND_CFLAGS) \
>   	$(NULL)
>   nbdkit_LDADD = \
> +	../lib/libnbdkit.la \

Is that ../ going to bite us on RHEL 7's older Automake?  Do we need to 
uses $(top_builddir) instead?

> +++ b/lib/lib.h
> @@ -0,0 +1,48 @@

> +#ifndef NBDKIT_LIB_H
> +#define NBDKIT_LIB_H
> +
> +#include <stdarg.h>
> +#include <stdbool.h>
> +#include <sys/types.h>
> +#include <sys/socket.h>
> +
> +/* Defines the private function which is used by the server to
> + * initialize libnbdkit.so at runtime.  This ABI may change at any
> + * time, which is why nbdkit and the corresponding libnbdkit.so must
> + * always be shipped together.
> + */
> +extern void libnbdkit_private_init (const char *expected_version);
> +

Should this read "may change at any time, other than the first parameter 
for expected_version, which is why..."?

> +#endif /* NBDKIT_LIB_H */
> diff --git a/lib/init.c b/lib/init.c

> +void
> +libnbdkit_private_init (const char *expected_version)
> +{
> +  if (strcmp (expected_version, PACKAGE_VERSION) != 0) {
> +    fprintf (stderr,
> +             "packaging error: "
> +             "nbdkit and libnbdkit.so versions do not match\n");
> +    abort ();

Works for me to keep the two in lock-step.

> +  }
> +}
> diff --git a/wrapper.c b/wrapper.c
> index 6aef81a1..eb0ba8ba 100644
> --- a/wrapper.c
> +++ b/wrapper.c

> @@ -193,7 +199,7 @@ main (int argc, char *argv[])
>     free (s);
>   
>     /* Absolute path of the real nbdkit command. */
> -  passthru_format ("%s/server/nbdkit", builddir);
> +  passthru_format ("%s/server/.libs/nbdkit", builddir);

Yep, I remember having to tweak that when playing with earlier attempts 
to fix dlopen() in VDDK.

> +++ b/lib/libnbdkit.syms

> +
> +# This linker script controls the visibility of symbols in the
> +# libnbdkit.so library.  We want to export some symbols to plugins,
> +# but at the same time we don't want plugins to be able to call
> +# arbitrary functions from nbdkit, so this script lists only the
> +# symbols we want to export.
> +
> +{
> +  # The functions we want plugins and filters to call.
> +  global:
> +
> +    # Private function that must only be called by the server.
> +    libnbdkit_private_init;
> +
> +  # Everything else is hidden.
> +  local: *;
> +};
> 

LGTM

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list