From: Ralf Wildenhues Date: Mon, 11 Jan 2010 20:56:23 +0000 (+0100) Subject: Ensure functions from resident modules work in atexit handlers. X-Git-Tag: v2.2.7b~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a75f8acf28774a6f9e9b9b7c015b51c378be1221;p=thirdparty%2Flibtool.git Ensure functions from resident modules work in atexit handlers. * tests/resident.at (resident modules): New file, new test. * Makefile.am (TESTSUITE_AT): Adjust. Report by Bob Friesenhahn. Signed-off-by: Ralf Wildenhues --- diff --git a/ChangeLog b/ChangeLog index 415a02f1a..b244706b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2010-01-11 Ralf Wildenhues + Ensure functions from resident modules work in atexit handlers. + * tests/resident.at (resident modules): New file, new test. + * Makefile.am (TESTSUITE_AT): Adjust. + Report by Bob Friesenhahn. + Testsuite exposure for relative output file names and deplibs. * tests/deplib-in-subdir.at (deplib in subdir): New file, new test. diff --git a/Makefile.am b/Makefile.am index 019084139..8d6682be5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -486,6 +486,7 @@ TESTSUITE_AT = tests/testsuite.at \ tests/lt_dlopenext.at \ tests/ltdl-api.at \ tests/lalib-syntax.at \ + tests/resident.at \ tests/slist.at \ tests/need_lib_prefix.at \ tests/standalone.at \ diff --git a/tests/resident.at b/tests/resident.at new file mode 100644 index 000000000..8667ca7fa --- /dev/null +++ b/tests/resident.at @@ -0,0 +1,136 @@ +# resident.at -- test resident modules -*- Autotest -*- + +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +#### + +# Ensure resident modules are not unloaded at program exit: +# they need to be able to invoke atexit handlers. + +AT_SETUP([resident modules]) +AT_KEYWORDS([libltdl]) + +AT_DATA([main.c], +[[#include +#include + +int +main (int argc, char* argv[]) +{ + int err = 0; + lt_dlhandle plugin_handle; + lt_dladvise advise; + + if (argc < 2) + { + fprintf (stderr, "usage: %s plugin\n", argv[0]); + return 1; + } + + lt_dlinit (); + if (lt_dladvise_init (&advise) != 0 + || lt_dladvise_ext (&advise) != 0 + || lt_dladvise_resident (&advise) != 0) + { + printf ("advise failure: %s\n", lt_dlerror ()); + err = 1; + } + else + { + plugin_handle = lt_dlopenadvise (argv[1], advise); + if (NULL != plugin_handle) + { + int (*pf) (void); + printf ("plugin opened successfully!\n"); + pf = lt_dlsym (plugin_handle, "setup_plugin"); + if (pf) + pf (); + else + { + printf ("dlsym failure: %s\n", lt_dlerror ()); + err = 1; + } + if (!lt_dlisresident (plugin_handle)) + { + printf ("module wrongly not marked resident\n"); + err = 1; + } + if (lt_dlclose (plugin_handle) != 0) + { + printf ("close failure (expected): %s\n", lt_dlerror ()); + } + else + { + printf ("wrongly closed resident module\n"); + err = 1; + } + } + else + { + printf ("plugin failed to open: %s\n", lt_dlerror ()); + err = 1; + } + if (lt_dladvise_destroy (&advise) != 0) + { + printf ("advise destroy failure: %s\n", lt_dlerror ()); + err = 1; + } + } + lt_dlexit (); + return err; +} +]]) + +AT_DATA([plugin.c], +[[#include + +void +bye (void) +{ + puts ("called from atexit handler"); +} + +int +setup_plugin (void) +{ + atexit (bye); +} +]]) + +: ${LTDLINCL="-I$abs_top_srcdir/libltdl"} +: ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"} + +CPPFLAGS="$LTDLINCL $CPPFLAGS" +LDFLAGS="$LDFLAGS -no-undefined" +inst=`pwd`/inst +libdir=$inst/lib + +AT_CHECK([$CC $CPPFLAGS $CFLAGS -c main.c], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c plugin.c], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o plugin.la -rpath $libdir ]dnl + [-module -avoid-version plugin.lo], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main$EXEEXT main.$OBJEXT ]dnl + [-dlopen plugin.la $LIBLTDL], + [], [ignore], [ignore]) +LT_AT_EXEC_CHECK([./main], [], [stdout], [ignore], [./plugin.la]) +AT_CHECK([grep 'called from atexit handler' stdout], [], [ignore]) + +AT_CLEANUP