]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
meson: add test-dlopen
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 15 Apr 2017 00:10:28 +0000 (20:10 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 24 Apr 2017 01:47:28 +0000 (21:47 -0400)
test-dlopen is a very simple binary that is only linked with libc and
libdl. From it we do dlopen() on the nss and pam modules to check that they are
linked to all necessary libs.

(meson-compiled nss modules are linked to less libraries, for whatever reason.
I suspected that some deps are missing, but it turns out that my suspicions
weren't justified, and the modules load just fine. Let's keep the test though,
it is very quick, and might detect missing linkage in the future.)

meson.build
src/test/meson.build
src/test/test-dlopen.c [new file with mode: 0644]

index 2b719ec2570086f87b4d7c455708eb24175e0502..86a04a70ed226d993c4a1359b124d5ec8d4c1e88 100644 (file)
@@ -1046,6 +1046,46 @@ libsystemd = shared_library(
 
 ############################################################
 
+# binaries that have --help and are intended for use by humans,
+# usually, but not always, installed in /bin.
+public_programs = []
+
+subdir('src/libudev')
+subdir('src/shared')
+subdir('src/core')
+subdir('src/udev')
+subdir('src/network')
+
+subdir('src/analyze')
+subdir('src/journal-remote')
+subdir('src/coredump')
+subdir('src/hostname')
+subdir('src/import')
+subdir('src/kernel-install')
+subdir('src/locale')
+subdir('src/machine')
+subdir('src/nspawn')
+subdir('src/resolve')
+subdir('src/timedate')
+subdir('src/timesync')
+subdir('src/vconsole')
+subdir('src/sulogin-shell')
+subdir('src/boot/efi')
+
+subdir('src/test')
+subdir('test')
+
+############################################################
+
+# only static linking apart from libdl, to make sure that the
+# module is linked to all libraries that it uses.
+test_dlopen = executable(
+  'test-dlopen',
+  test_dlopen_c,
+  include_directories : includes,
+  link_with : [libbasic],
+  dependencies : [libdl])
+
 foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME', []],
                  ['systemd',     '',               []],
                  ['mymachines', 'ENABLE_MACHINED', []],
@@ -1059,7 +1099,7 @@ foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME', []],
     sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
     version_script_arg = join_paths(meson.current_source_dir(), sym)
 
-    shared_library(
+    nss = shared_library(
       'nss_' + module,
       'src/nss-@0@/nss-@0@.c'.format(module),
       version : '2',
@@ -1080,40 +1120,15 @@ foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME', []],
     meson.add_install_script('sh', '-c',
                              'rm $DESTDIR@0@/libnss_@1@.so'
                              .format(rootlibdir, module))
+
+    test('dlopen-nss_' + module,
+         test_dlopen,
+         args : [nss.full_path()]) # path to dlopen must include a slash
   endif
 endforeach
 
 ############################################################
 
-# binaries that have --help and are intended for use by humans,
-# usually, but not always, installed in /bin.
-public_programs = []
-
-subdir('src/libudev')
-subdir('src/shared')
-subdir('src/core')
-subdir('src/udev')
-subdir('src/network')
-
-subdir('src/analyze')
-subdir('src/journal-remote')
-subdir('src/coredump')
-subdir('src/hostname')
-subdir('src/import')
-subdir('src/kernel-install')
-subdir('src/locale')
-subdir('src/machine')
-subdir('src/nspawn')
-subdir('src/resolve')
-subdir('src/timedate')
-subdir('src/timesync')
-subdir('src/vconsole')
-subdir('src/sulogin-shell')
-subdir('src/boot/efi')
-
-subdir('src/test')
-subdir('test')
-
 executable('systemd',
            systemd_sources,
            include_directories : includes,
@@ -1325,7 +1340,7 @@ if conf.get('ENABLE_LOGIND', 0) == 1
 
   if conf.get('HAVE_PAM', 0) == 1
     version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
-    shared_library(
+    pam_systemd = shared_library(
       'pam_systemd',
       pam_systemd_c,
       name_prefix : '',
@@ -1340,6 +1355,10 @@ if conf.get('ENABLE_LOGIND', 0) == 1
       link_depends : pam_systemd_sym,
       install : true,
       install_dir : pamlibdir)
+
+    test('dlopen-pam_systemd',
+         test_dlopen,
+         args : [pam_systemd.full_path()]) # path to dlopen must include a slash
   endif
 endif
 
index 17fda96af0451da30fb78423e03852569906756d..59a51d857e52c19e5790b9f2b1c9d7e28b668918 100644 (file)
@@ -35,6 +35,8 @@ test_libudev_sym_c = custom_target(
   command : [generate_sym_test_py, '@INPUT0@', '@INPUT1@'],
   capture : true)
 
+test_dlopen_c = files('test-dlopen.c')
+
 ############################################################
 
 tests += [
diff --git a/src/test/test-dlopen.c b/src/test/test-dlopen.c
new file mode 100644 (file)
index 0000000..9f5343a
--- /dev/null
@@ -0,0 +1,32 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#include "macro.h"
+
+int main(int argc, char **argv) {
+        void *handle;
+
+        assert_se((handle = dlopen(argv[1], RTLD_NOW)));
+        assert_se(dlclose(handle) == 0);
+
+        return EXIT_SUCCESS;
+}