From bc1d8ca01415710d40224de312c7ecf6f4223301 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Mon, 6 Nov 2017 18:46:41 -0500 Subject: [PATCH] Fix: detect dlmopen() and disable corresponding tests if not available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit musl and uClibc-ng are known not to support dlmopen(). LTTng-UST has this dlmopen() detection. Signed-off-by: Philippe Proulx [Philippe: backport from upstream commit bc1d8ca0 edited to remove .gitignore part] Signed-off-by: Jérémie Galarneau --- .gitignore | 1 + configure.ac | 25 ++++++++++++++++++++++ tests/regression/ust/ust-dl/prog.c | 17 +++++++++++++-- tests/regression/ust/ust-dl/test_ust-dl | 32 ---------------------------- tests/regression/ust/ust-dl/test_ust-dl.in | 34 ++++++++++++++++++++++++++++++ tests/regression/ust/ust-dl/test_ust-dl.py | 9 +++++++- tests/utils/test_utils.py | 3 +++ 7 files changed, 86 insertions(+), 35 deletions(-) delete mode 100755 tests/regression/ust/ust-dl/test_ust-dl create mode 100644 tests/regression/ust/ust-dl/test_ust-dl.in diff --git a/configure.ac b/configure.ac index 016c56ec..b6ea39c5 100644 --- a/configure.ac +++ b/configure.ac @@ -196,6 +196,30 @@ AC_CHECK_FUNCS([ \ # add -lrt to LIBS AC_CHECK_LIB([rt], [clock_gettime, timer_create, timer_settime, timer_delete]) +# Checks for dl. +AC_CHECK_LIB([dl], [dlopen], [ + have_libdl=yes + libdl_name=dl +], [ + # libdl not found, check for dlopen in libc. + AC_CHECK_LIB([c], [dlopen], [ + have_libc_dl=yes + libdl_name=c + ], [ + AC_MSG_ERROR([Cannot find dlopen in libdl nor libc. Use [LDFLAGS]=-Ldir to specify their location.]) + ]) +]) + +# Check if libdl has dlmopen support. +AH_TEMPLATE([HAVE_DLMOPEN], ["Define to 1 if dlmopen is available."]) +AC_CHECK_LIB([$libdl_name], [dlmopen], [ + AC_DEFINE([HAVE_DLMOPEN], [1]) + HAVE_DLMOPEN=1 +], [ + HAVE_DLMOPEN=0 +]) +AC_SUBST(HAVE_DLMOPEN) + # Babeltrace viewer check AC_ARG_WITH([babeltrace-bin], AS_HELP_STRING([--with-babeltrace-bin], @@ -1100,6 +1124,7 @@ AC_CONFIG_FILES([ AC_CONFIG_FILES([tests/regression/ust/python-logging/test_python_logging],[chmod +x tests/regression/ust/python-logging/test_python_logging]) # Inject LTTNG_TOOLS_BUILD_WITH_LIBPFM variable in test script. AC_CONFIG_FILES([tests/perf/test_perf_raw],[chmod +x tests/perf/test_perf_raw]) +AC_CONFIG_FILES([tests/regression/ust/ust-dl/test_ust-dl],[chmod +x tests/regression/ust/ust-dl/test_ust-dl]) AC_OUTPUT diff --git a/tests/regression/ust/ust-dl/prog.c b/tests/regression/ust/ust-dl/prog.c index e8e4b264..669792d9 100644 --- a/tests/regression/ust/ust-dl/prog.c +++ b/tests/regression/ust/ust-dl/prog.c @@ -13,7 +13,12 @@ */ int main(int argc, char **argv) { - void *h0, *h1, *h2, *h3, *h4; + void *h0, *h2, *h3, *h4; + +#ifdef HAVE_DLMOPEN + void *h1; +#endif + char *error; int (*foo)(void); @@ -21,10 +26,14 @@ int main(int argc, char **argv) if (!h0) { goto get_error; } + +#ifdef HAVE_DLMOPEN h1 = dlmopen(LM_ID_BASE, "libfoo.so", RTLD_LAZY); if (!h1) { goto get_error; } +#endif + h2 = dlopen("libzzz.so", RTLD_LAZY); if (!h2) { goto get_error; @@ -38,7 +47,7 @@ int main(int argc, char **argv) goto get_error; } - foo = dlsym(h1, "foo"); + foo = dlsym(h3, "foo"); error = dlerror(); if (error != NULL) { goto error; @@ -49,9 +58,13 @@ int main(int argc, char **argv) if (dlclose(h0)) { goto get_error; } + +#ifdef HAVE_DLMOPEN if (dlclose(h1)) { goto get_error; } +#endif + if (dlclose(h2)) { goto get_error; } diff --git a/tests/regression/ust/ust-dl/test_ust-dl b/tests/regression/ust/ust-dl/test_ust-dl deleted file mode 100755 index 1f2934db..00000000 --- a/tests/regression/ust/ust-dl/test_ust-dl +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# -# Copyright (C) - 2013 Jérémie Galarneau -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License, version 2 only, as -# published by the Free Software Foundation. -# -# This program 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 General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -CURDIR=$(dirname $0) -TESTDIR=${CURDIR}/../../.. - -source $TESTDIR/utils/utils.sh - -if [ ! -x "$CURDIR/.libs/libfoo.so" ]; then - diag "No shared object generated. Skipping all tests." - exit 0 -fi - -start_lttng_sessiond_notap - -python3 ${CURDIR}/test_ust-dl.py - -stop_lttng_sessiond_notap diff --git a/tests/regression/ust/ust-dl/test_ust-dl.in b/tests/regression/ust/ust-dl/test_ust-dl.in new file mode 100644 index 00000000..61d00d21 --- /dev/null +++ b/tests/regression/ust/ust-dl/test_ust-dl.in @@ -0,0 +1,34 @@ +#!/bin/bash +# +# Copyright (C) - 2013 Jérémie Galarneau +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License, version 2 only, as +# published by the Free Software Foundation. +# +# This program 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 General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +CURDIR=$(dirname $0) +TESTDIR=${CURDIR}/../../.. + +source $TESTDIR/utils/utils.sh + +if [ ! -x "$CURDIR/.libs/libfoo.so" ]; then + diag "No shared object generated. Skipping all tests." + exit 0 +fi + +export LTTNG_TOOLS_HAVE_DLMOPEN=@HAVE_DLMOPEN@ + +start_lttng_sessiond_notap + +python3 ${CURDIR}/test_ust-dl.py + +stop_lttng_sessiond_notap diff --git a/tests/regression/ust/ust-dl/test_ust-dl.py b/tests/regression/ust/ust-dl/test_ust-dl.py index 81972a7d..72459840 100644 --- a/tests/regression/ust/ust-dl/test_ust-dl.py +++ b/tests/regression/ust/ust-dl/test_ust-dl.py @@ -31,6 +31,9 @@ sys.path.append(test_utils_path) from test_utils import * +have_dlmopen = (os.environ.get('LTTNG_TOOLS_HAVE_DLMOPEN') == '1') + + NR_TESTS = 14 current_test = 1 print("1..{0}".format(NR_TESTS)) @@ -113,7 +116,11 @@ current_test += 1 print_test_result(dlopen_event_found > 0, current_test, "lttng_ust_dl:dlopen event found in resulting trace") current_test += 1 -print_test_result(dlmopen_event_found > 0, current_test, "lttng_ust_dl:dlmopen event found in resulting trace") +if have_dlmopen: + print_test_result(dlmopen_event_found > 0, current_test, "lttng_ust_dl:dlmopen event found in resulting trace") +else: + skip_test(current_test, 'dlmopen() is not available') + current_test += 1 print_test_result(build_id_event_found > 0, current_test, "lttng_ust_dl:build_id event found in resulting trace") diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index 4b38630c..02e632a2 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -62,6 +62,9 @@ def print_test_result(result, number, description): result_string += " {0} - {1}".format(number, description) print(result_string) +def skip_test(number, description): + print('ok {} # skip {}'.format(number, description)) + def enable_ust_tracepoint_event(session_info, event_name): event = Event() event.name = event_name -- 2.15.0