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

Richard W.M. Jones rjones at redhat.com
Thu Mar 26 20:13:19 UTC 2020


Currently it does nothing.
---
 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(-)

diff --git a/configure.ac b/configure.ac
index 92e0d4e3..bf720cec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1057,6 +1057,7 @@ AC_CONFIG_FILES([Makefile
                  filters/truncate/Makefile
                  filters/xz/Makefile
                  fuzzing/Makefile
+                 lib/Makefile
                  server/Makefile
                  server/nbdkit.pc
                  tests/functions.sh
diff --git a/Makefile.am b/Makefile.am
index ec8ae05d..3e6091f7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -75,6 +75,7 @@ SUBDIRS = \
 	common/include \
 	common/protocol \
 	common/utils \
+	lib \
 	server \
 	$(NULL)
 
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644
index 00000000..4896dc95
--- /dev/null
+++ b/lib/Makefile.am
@@ -0,0 +1,71 @@
+# nbdkit
+# Copyright (C) 2013-2020 Red Hat Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Red Hat nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+include $(top_srcdir)/common-rules.mk
+
+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
+endif
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 \
 	$(GNUTLS_LIBS) \
 	$(LIBSELINUX_LIBS) \
 	$(DL_LIBS) \
@@ -142,6 +144,7 @@ test_public_SOURCES = \
 	extents.c \
 	$(NULL)
 test_public_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/common/include \
 	-I$(top_srcdir)/common/protocol \
diff --git a/server/internal.h b/server/internal.h
index b43798ff..a1db231e 100644
--- a/server/internal.h
+++ b/server/internal.h
@@ -43,6 +43,7 @@
 #define NBDKIT_INTERNAL
 #include "nbdkit-plugin.h"
 #include "nbdkit-filter.h"
+#include "lib.h"
 #include "cleanup.h"
 #include "nbd-protocol.h"
 
diff --git a/lib/lib.h b/lib/lib.h
new file mode 100644
index 00000000..2d7ca930
--- /dev/null
+++ b/lib/lib.h
@@ -0,0 +1,48 @@
+/* nbdkit
+ * Copyright (C) 2013-2020 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of Red Hat nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#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);
+
+#endif /* NBDKIT_LIB_H */
diff --git a/lib/init.c b/lib/init.c
new file mode 100644
index 00000000..ef7eeb3d
--- /dev/null
+++ b/lib/init.c
@@ -0,0 +1,53 @@
+/* nbdkit
+ * Copyright (C) 2013-2020 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of Red Hat nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "lib.h"
+
+bool *verbose;
+
+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 ();
+  }
+}
diff --git a/wrapper.c b/wrapper.c
index 6aef81a1..eb0ba8ba 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -168,12 +168,16 @@ main (int argc, char *argv[])
     }
   }
 
-  /* Needed for plugins written in OCaml. */
+  /* Use libnbdkit.so from lib/.  The plugins/ocaml/.libs path is
+   * needed for plugins written in OCaml.
+   */
   s = getenv ("LD_LIBRARY_PATH");
   if (s)
-    r = asprintf (&s, "%s/plugins/ocaml/.libs:%s", builddir, s);
+    r = asprintf (&s, "%s/lib/.libs:%s/plugins/ocaml/.libs:%s",
+                  builddir, builddir, s);
   else
-    r = asprintf (&s, "%s/plugins/ocaml/.libs", builddir);
+    r = asprintf (&s, "%s/lib/.libs:%s/plugins/ocaml/.libs",
+                  builddir, builddir);
   if (r < 0) {
     perror ("asprintf");
     exit (EXIT_FAILURE);
@@ -182,9 +186,11 @@ main (int argc, char *argv[])
   free (s);
   s = getenv ("LIBRARY_PATH");
   if (s)
-    r = asprintf (&s, "%s/plugins/ocaml/.libs:%s", builddir, s);
+    r = asprintf (&s, "%s/lib/.libs:%s/plugins/ocaml/.libs:%s",
+                  builddir, builddir, s);
   else
-    r = asprintf (&s, "%s/plugins/ocaml/.libs", builddir);
+    r = asprintf (&s, "%s/lib/.libs:%s/plugins/ocaml/.libs",
+                  builddir, builddir);
   if (r < 0) {
     perror ("asprintf");
     exit (EXIT_FAILURE);
@@ -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);
 
   /* Option parsing.  We don't really parse options here.  We are only
    * interested in which options have arguments and which need
diff --git a/lib/libnbdkit.syms b/lib/libnbdkit.syms
new file mode 100644
index 00000000..a70b35fc
--- /dev/null
+++ b/lib/libnbdkit.syms
@@ -0,0 +1,47 @@
+# nbdkit
+# Copyright (C) 2018-2020 Red Hat Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Red Hat nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+# 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: *;
+};
-- 
2.25.0




More information about the Libguestfs mailing list