# Do not build this test if shared libraries support was
# explicitly disabled.
-CLEANFILES = libfoo.so libfoo.so.debug prog
+CLEANFILES = libfoo.so libfoo.so.debug libbar.so libbar.so.debug \
+ libzzz.so libzzz.so.debug prog
EXTRA_DIST = test_ust-dl test_ust-dl.py libfoo.c libfoo.h \
- prog.c
+ libbar.c libbar.h libzzz.c libzzz.h prog.c
else
prog_SOURCES = prog.c
prog_LDADD = -ldl
-noinst_LTLIBRARIES = libfoo.la
+noinst_LTLIBRARIES = libzzz.la libbar.la libfoo.la
+
+libzzz_la_SOURCES = libzzz.c libzzz.h
+libzzz_la_LDFLAGS = -module -shared -avoid-version \
+ -rpath $(abs_builddir)
+
+libbar_la_SOURCES = libbar.c libbar.h
+libbar_la_LDFLAGS = -module -shared -avoid-version \
+ -rpath $(abs_builddir)
+libbar_la_LIBADD = libzzz.la
+
libfoo_la_SOURCES = libfoo.c libfoo.h
libfoo_la_LDFLAGS = -module -shared -avoid-version \
-rpath $(abs_builddir)
+libfoo_la_LIBADD = libbar.la
-CLEANFILES = libfoo.so libfoo.so.debug
+CLEANFILES = libfoo.so libfoo.so.debug libbar.so libbar.so.debug \
+ libzzz.so libzzz.so.debug
# Extract debug symbols
libfoo.so.debug: libfoo.la
$(objcopy_verbose)$(OBJCOPY) --only-keep-debug .libs/libfoo.so libfoo.so.debug
+libbar.so.debug: libbar.la
+ $(objcopy_verbose)$(OBJCOPY) --only-keep-debug .libs/libbar.so libbar.so.debug
+libzzz.so.debug: libzzz.la
+ $(objcopy_verbose)$(OBJCOPY) --only-keep-debug .libs/libzzz.so libzzz.so.debug
# Strip and add debuglink
libfoo.so: libfoo.so.debug
@cp -f .libs/libfoo.so libfoo.so
$(objcopy_verbose)$(OBJCOPY) --strip-debug --add-gnu-debuglink=libfoo.so.debug libfoo.so
+libbar.so: libbar.so.debug
+ @cp -f .libs/libbar.so libbar.so
+ $(objcopy_verbose)$(OBJCOPY) --strip-debug --add-gnu-debuglink=libbar.so.debug libbar.so
+libzzz.so: libzzz.so.debug
+ @cp -f .libs/libzzz.so libzzz.so
+ $(objcopy_verbose)$(OBJCOPY) --strip-debug --add-gnu-debuglink=libzzz.so.debug libzzz.so
noinst_SCRIPTS = test_ust-dl test_ust-dl.py
EXTRA_DIST = test_ust-dl test_ust-dl.py
-all-local: libfoo.so
+all-local: libfoo.so libbar.so libzzz.so
@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
for script in $(EXTRA_DIST); do \
cp -f $(srcdir)/$$script $(builddir); \
+/* _GNU_SOURCE is defined by config.h */
#include <dlfcn.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
-int main()
+/*
+ * libfoo has a direct dependency on libbar.
+ * libbar has a direct dependency on libzzz.
+ * This test is therefore a mix of dlopen/dlclose and dlmopen/dlclose of
+ * libfoo, and of its direct dependencies.
+ */
+int main(int argc, char **argv)
{
- void *handle;
- int (*foo)();
+ void *h0, *h1, *h2, *h3, *h4;
+ char *error;
+ int (*foo)(void);
- handle = dlopen("libfoo.so", RTLD_LAZY);
- foo = dlsym(handle, "foo");
+ h0 = dlopen("libbar.so", RTLD_LAZY);
+ if (!h0) {
+ goto get_error;
+ }
+ h1 = dlmopen(LM_ID_BASE, "libfoo.so", RTLD_LAZY);
+ if (!h1) {
+ goto get_error;
+ }
+ h2 = dlopen("libzzz.so", RTLD_LAZY);
+ if (!h2) {
+ goto get_error;
+ }
+ h3 = dlopen("libfoo.so", RTLD_LAZY);
+ if (!h3) {
+ goto get_error;
+ }
+ h4 = dlopen("libfoo.so", RTLD_LAZY);
+ if (!h4) {
+ goto get_error;
+ }
- (*foo)();
+ foo = dlsym(h1, "foo");
+ error = dlerror();
+ if (error != NULL) {
+ goto error;
+ }
- dlclose(handle);
+ foo();
- return 0;
+ if (dlclose(h0)) {
+ goto get_error;
+ }
+ if (dlclose(h1)) {
+ goto get_error;
+ }
+ if (dlclose(h2)) {
+ goto get_error;
+ }
+ if (dlclose(h3)) {
+ goto get_error;
+ }
+ if (dlclose(h4)) {
+ goto get_error;
+ }
+
+ exit(EXIT_SUCCESS);
+
+get_error:
+ error = dlerror();
+error:
+ fprintf(stderr, "%s\n", error);
+ exit(EXIT_FAILURE);
}
from test_utils import *
-NR_TESTS = 6
+NR_TESTS = 11
current_test = 1
print("1..{0}".format(NR_TESTS))
except FileNotFoundError:
bail("Could not open babeltrace. Please make sure it is installed.", session_info)
-dlopen_event_found = False
-build_id_event_found = False
-debug_link_event_found = False
-dlclose_event_found = False
+dlopen_event_found = 0
+dlmopen_event_found = 0
+build_id_event_found = 0
+debug_link_event_found = 0
+dlclose_event_found = 0
+load_event_found = 0
+load_build_id_event_found = 0
+load_debug_link_event_found = 0
+unload_event_found = 0
+load_libfoo_found = 0
+load_libbar_found = 0
+load_libzzz_found = 0
for event_line in babeltrace_process.stdout:
- # Let babeltrace finish to get the return code
- if dlopen_event_found and build_id_event_found and \
- debug_link_event_found and dlclose_event_found:
- continue
event_line = event_line.decode('utf-8').replace("\n", "")
if re.search(r".*lttng_ust_dl:dlopen.*", event_line) is not None:
- dlopen_event_found = True
+ dlopen_event_found += 1
+ elif re.search(r".*lttng_ust_dl:dlmopen.*", event_line) is not None:
+ dlmopen_event_found += 1
elif re.search(r".*lttng_ust_dl:build_id.*", event_line) is not None:
- build_id_event_found = True
+ build_id_event_found += 1
elif re.search(r".*lttng_ust_dl:debug_link.*", event_line) is not None:
- debug_link_event_found = True
+ debug_link_event_found += 1
elif re.search(r".*lttng_ust_dl:dlclose.*", event_line) is not None:
- dlclose_event_found = True
+ dlclose_event_found += 1
+ elif re.search(r".*lttng_ust_lib:build_id.*", event_line) is not None:
+ load_build_id_event_found += 1
+ elif re.search(r".*lttng_ust_lib:debug_link.*", event_line) is not None:
+ load_debug_link_event_found += 1
+ elif re.search(r".*lttng_ust_lib:unload.*", event_line) is not None:
+ unload_event_found += 1
+ elif re.search(r".*lttng_ust_lib:load.*", event_line) is not None:
+ load_event_found += 1
+ if re.search(r".*lttng_ust_lib:load.*libfoo.*", event_line) is not None:
+ load_libfoo_found += 1
+ elif re.search(r".*lttng_ust_lib:load.*libbar.*", event_line) is not None:
+ load_libbar_found += 1
+ elif re.search(r".*lttng_ust_lib:load.*libzzz.*", event_line) is not None:
+ load_libzzz_found += 1
babeltrace_process.wait()
print_test_result(babeltrace_process.returncode == 0, current_test, "Resulting trace is readable")
current_test += 1
-print_test_result(dlopen_event_found, current_test, "lttng_ust_dl:dlopen event found in resulting trace")
+print_test_result(dlopen_event_found > 0, current_test, "lttng_ust_dl:dlopen event found in resulting trace")
current_test += 1
-print_test_result(build_id_event_found, current_test, "lttng_ust_dl:build_id event found in resulting trace")
+print_test_result(dlmopen_event_found > 0, current_test, "lttng_ust_dl:dlmopen event found in resulting trace")
current_test += 1
-print_test_result(debug_link_event_found, current_test, "lttng_ust_dl:debug_link event found in resulting trace")
+print_test_result(build_id_event_found > 0, current_test, "lttng_ust_dl:build_id event found in resulting trace")
current_test += 1
-print_test_result(dlclose_event_found, current_test, "lttng_ust_dl:dlclose event found in resulting trace")
+print_test_result(debug_link_event_found > 0, current_test, "lttng_ust_dl:debug_link event found in resulting trace")
+current_test += 1
+
+print_test_result(dlclose_event_found > 0, current_test, "lttng_ust_dl:dlclose event found in resulting trace")
+current_test += 1
+
+print_test_result(load_event_found > 0, current_test, "lttng_ust_lib:load event found in resulting trace")
+current_test += 1
+
+print_test_result(load_build_id_event_found > 0, current_test, "lttng_ust_lib:build_id event found in resulting trace")
+current_test += 1
+
+print_test_result(load_debug_link_event_found > 0, current_test, "lttng_ust_lib:debug_link event found in resulting trace")
+current_test += 1
+
+print_test_result(unload_event_found == 3, current_test, "lttng_ust_lib:unload event found 3 times in resulting trace")
+current_test += 1
+
+print_test_result(load_libfoo_found == 1, current_test, "lttng_ust_lib:load libfoo.so event found once in resulting trace")
+current_test += 1
+
+print_test_result(load_libbar_found == 1, current_test, "lttng_ust_lib:load libbar.so event found once in resulting trace")
+current_test += 1
+
+print_test_result(load_libzzz_found == 1, current_test, "lttng_ust_lib:load libzzz.so event found once in resulting trace")
current_test += 1
shutil.rmtree(session_info.tmp_directory)