| # lt_dlexit.at -- test libltdl functionality -*- Autotest -*- |
| # |
| # Copyright (C) 2007, 2008 Free Software Foundation, Inc. |
| # Written by Dave Brolley & Ralf Wildenhues, 2007 |
| # |
| # 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. |
| #### |
| |
| # Try to keep the new interfaces of HEAD separate from those of |
| # branch-1-5 to facilitate testing of older releases. |
| |
| AT_BANNER([Libltdl functionality.]) |
| |
| AT_SETUP([lt_dlexit unloading libs]) |
| AT_KEYWORDS([libltdl]) |
| |
| # Test for |
| # http://lists.gnu.org/archive/html/bug-libtool/2007-01/msg00014.html |
| # http://lists.gnu.org/archive/html/bug-libtool/2008-03/msg00013.html |
| |
| AT_DATA([main.c], |
| [[#include <ltdl.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| typedef int (*pfun_T) (int); |
| typedef int *pvar_T; |
| |
| /* lt_dlopen wrapper */ |
| static lt_dlhandle |
| xdlopen (const char *filename) |
| { |
| lt_dlhandle handle = lt_dlopen (filename); |
| if (!handle) { |
| fprintf (stderr, "can't open the module %s!\n", filename); |
| fprintf (stderr, "error was: %s\n", lt_dlerror()); |
| } |
| return handle; |
| } |
| |
| /* lt_dlsym wrapper: try one function and one variable */ |
| static int |
| xdlsymtest (lt_dlhandle handle, const char *func, const char *var) |
| { |
| pfun_T pf = (pfun_T) lt_dlsym (handle, func); |
| pvar_T pv = (pvar_T) lt_dlsym (handle, var); |
| if (pf == NULL) { |
| fprintf (stderr, "function `%s' not found\n", func); |
| return 1; |
| } |
| if (pv == NULL) { |
| fprintf (stderr, "variable `%s' not found\n", var); |
| return 1; |
| } |
| return (*pf) (*pv); |
| } |
| |
| int |
| main (void) |
| { |
| lt_dlhandle b1; |
| |
| LTDL_SET_PRELOADED_SYMBOLS(); |
| if (lt_dlinit() != 0) { |
| fprintf (stderr, "error during initialization: %s\n", lt_dlerror()); |
| return 1; |
| } |
| if (lt_dlexit() != 0) { |
| fprintf (stderr, "error during first lt_dlexit: %s\n", lt_dlerror()); |
| return 1; |
| } |
| if (lt_dlinit() != 0) { |
| fprintf (stderr, "error during second initialization: %s\n", lt_dlerror()); |
| return 1; |
| } |
| if (!(b1 = xdlopen ("modb1.la"))) return 1; |
| if (xdlsymtest (b1, "fb1", "vb1")) return 1; |
| /* do not lt_dlclose here on purpose. */ |
| |
| if (lt_dlexit() != 0) { |
| fprintf (stderr, "error during exit: %s\n", lt_dlerror()); |
| return 1; |
| } |
| return 0; |
| } |
| ]]) |
| |
| |
| AT_DATA([a1.c], |
| [[#ifdef __cplusplus |
| extern "C" { |
| #endif |
| int f1 (int x) { return x - 1; } |
| int v1 = 1; |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| |
| AT_DATA([b1.c], |
| [[#ifdef __cplusplus |
| extern "C" { |
| #endif |
| extern int f1 (int), v1; |
| int fb1 (int x) { return f1 (v1) + x - 3; } |
| int vb1 = 3; |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| |
| |
| : ${LTDLINCL="-I$abs_top_srcdir/libltdl"} |
| : ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"} |
| |
| # Skip this test when called from: |
| # make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-ltdl-install |
| AT_CHECK([case $LIBLTDL in #( |
| */_inst/lib/*) test -f $LIBLTDL || (exit 77) ;; |
| esac], [], [ignore]) |
| |
| CPPFLAGS="$LTDLINCL $CPPFLAGS" |
| LDFLAGS="$LDFLAGS -no-undefined" |
| |
| for file in a1 b1; do |
| $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file.c |
| done |
| $CC $CPPFLAGS $CFLAGS -c main.c |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba1.la a1.lo \ |
| -rpath /foo -avoid-version], [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o modb1.la b1.lo \ |
| -rpath /foo -module -avoid-version liba1.la], [], [ignore], [ignore]) |
| |
| # TODO: test -dlpreopen |
| for dlopen in -dlopen; do |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT \ |
| $dlopen modb1.la $LIBLTDL], [], [ignore], [ignore]) |
| LT_AT_NOINST_EXEC_CHECK([./main], [-dlopen modb1.la]) |
| done |
| |
| AT_CLEANUP |