mirror of
git://git.savannah.gnu.org/libtool.git
synced 2025-01-18 14:16:00 +08:00
a894e3baee
need a library prefix like 'lib', such as BeOS. Fix a number of bugs exposed by this test in order for it to pass. Currently the prefix is hardcoded as 'lib', as I am not aware of systems that require a different prefix: * libltdl/loaders/preopen.c (lt_dlpreload_open): Move error condition out of test loop to be sure that each originator is tried, instead of erroring out if the first doesn't match. Support passing NULL as the originator to load all preloaded modules originating in the program itself. * libltdl/lt_dlloader.c (lt_dlloader_dump): New debug function. * libltdl/libltdl/lt_dlloader.h (lt_dlloader_dump): Declare it when LT_DEBUG_LOADERS is defined at compile time. * libltdl/ltdl.c (lt_dlinit): Dump loader list after successful initialisation. (tryall_dlopen): Add a new VTABLE parameter to force use of a specific loader in preference to trying every loader in turn. Adjust all callers. (try_dlopen): Always see whether a module was preloaded for module names with no directory component before searching the filesystem for a match. * libltdl/m4/libtool.m4 (_LT_CMD_GLOBAL_SYMBOLS): Declare a new global_symbol_to_c_name_address_lib_prefix variable. (global_symbol_to_c_name_address_lib_prefix): The sed expressions to use when a lib prefix is enforced need to be slightly different to work with preloaded modules. * libltdl/config/ltmain.m4sh (func_generate_dlsyms): In order to name preloaded symbols correctly for the lookup algorithm to work when the loaded module file must be prefixed with lib. Use global_symbol_to_c_name_address_lib_prefix when need_lib_prefix is other than no. * tests/need_lib_prefix.at: New test to check for breakage on hosts where need_lib_prefix is unknown. * Makefile.am (TESTSUITE_AT): Add new test. * tests/TODO: Note missing tests that would have caught some of the latent bugs fixed by this patch. * HACKING: Document libltdl keyword. * NEWS: Updated.
180 lines
4.1 KiB
Plaintext
180 lines
4.1 KiB
Plaintext
# need-lib-prefix.at -- test libltdl functionality -*- Autotest -*-
|
|
#
|
|
# Copyright (C) 2007 Free Software Foundation, Inc.
|
|
# Written by Gary V. Vaughan, 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.
|
|
####
|
|
|
|
AT_SETUP([enforced lib prefix])
|
|
AT_KEYWORDS([libltdl libtool])
|
|
|
|
AT_DATA([main.c],
|
|
[[#include <ltdl.h>
|
|
#include <stdio.h>
|
|
|
|
typedef int fun (int);
|
|
|
|
static int errors = 0;
|
|
|
|
static void
|
|
complain (const char *msg)
|
|
{
|
|
const char *errmsg = lt_dlerror ();
|
|
fprintf (stderr, "%s", msg);
|
|
if (errmsg)
|
|
fprintf (stderr, ": %s\n", errmsg);
|
|
else
|
|
fprintf (stderr, ".\n");
|
|
++errors;
|
|
}
|
|
|
|
static lt_dlhandle
|
|
moduleopen (const char *filename)
|
|
{
|
|
lt_dlhandle handle;
|
|
|
|
handle = lt_dlopen (filename);
|
|
if (!handle)
|
|
{
|
|
fprintf (stderr, "can't open the module %s!\n", filename);
|
|
complain ("error was");
|
|
}
|
|
|
|
return handle;
|
|
}
|
|
|
|
static int
|
|
moduletest (lt_dlhandle handle)
|
|
{
|
|
const lt_dlinfo *info = lt_dlgetinfo (handle);
|
|
fun *f = (fun *) lt_dlsym (handle, "f");
|
|
int *v = (int *) lt_dlsym (handle, "i");
|
|
|
|
if (!f)
|
|
{
|
|
complain ("function `f' not found");
|
|
return 1;
|
|
}
|
|
if (!v)
|
|
{
|
|
complain ("variable `i' not found");
|
|
return 1;
|
|
}
|
|
printf ("%s: %d\n", info->name, f (*v));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
lt_dlhandle handle;
|
|
|
|
LTDL_SET_PRELOADED_SYMBOLS();
|
|
|
|
if (lt_dlinit() != 0)
|
|
{
|
|
fprintf (stderr, "error during initialization: %s\n", lt_dlerror());
|
|
return 1;
|
|
}
|
|
|
|
if (lt_dlpreload_open (0, moduletest) != 0)
|
|
complain ("error during preloading");
|
|
|
|
if (lt_dlexit () != 0)
|
|
complain ("error during exit");
|
|
|
|
return (errors != 0);
|
|
}
|
|
]])
|
|
|
|
AT_DATA([foo1.c],
|
|
[[#define f foo1_LTX_f
|
|
#define i foo1_LTX_i
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
int f (int x) { return x / 3; }
|
|
int i = 7;
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
]])
|
|
|
|
AT_DATA([foo2.c],
|
|
[[#define f libfoo2_LTX_f
|
|
#define i libfoo2_LTX_i
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
int f (int x) { return (x * x) / 10; }
|
|
int i = 6;
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
]])
|
|
|
|
AT_DATA([expout],
|
|
[[libfoo1: 2
|
|
libfoo2: 3
|
|
]])
|
|
|
|
: ${LTDLINCL="-I$abs_top_srcdir/libltdl"}
|
|
: ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"}
|
|
|
|
CPPFLAGS="$CPPFLAGS $LTDLINCL"
|
|
LDFLAGS="$LDFLAGS"
|
|
|
|
# Create our own libtool, forcing need_lib_prefix setting
|
|
sed 's,^\(need_lib_prefix\)=.*$,\1=unknown,' $LIBTOOL > ./libtool
|
|
LIBTOOL="$SHELL ./libtool"
|
|
|
|
# Installation directory:
|
|
instdir=`pwd`/_inst
|
|
|
|
$CC $CPPFLAGS $CFLAGS -c main.c
|
|
for file in foo1 foo2; do
|
|
$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file.c
|
|
done
|
|
|
|
AT_CHECK([$LIBTOOL --mode=link $CC -module -avoid-version $CFLAGS $LDFLAGS -o foo1.la foo1.lo -rpath $instdir/lib],
|
|
[], [ignore], [ignore])
|
|
AT_CHECK([$LIBTOOL --mode=link $CC -module -avoid-version $CFLAGS $LDFLAGS -o libfoo2.la foo2.lo -rpath $instdir/lib],
|
|
[], [ignore], [ignore])
|
|
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT -dlpreopen foo1.la -dlpreopen libfoo2.la $LIBLTDL],
|
|
[], [ignore], [ignore])
|
|
|
|
LT_AT_NOINST_EXEC_CHECK([./main], [-dlopen foo1.la -dlopen libfoo2.la],
|
|
[], [expout], [])
|
|
|
|
# Install the libraries.
|
|
mkdir $instdir
|
|
mkdir $instdir/lib
|
|
$LIBTOOL --mode=install cp foo1.la $instdir/lib/foo1.la
|
|
$LIBTOOL --mode=install cp libfoo2.la $instdir/lib/libfoo2.la
|
|
|
|
# Install the binary
|
|
mkdir $instdir/bin
|
|
$LIBTOOL --mode=install cp main $instdir/bin/main
|
|
|
|
LT_AT_EXEC_CHECK([$instdir/bin/main], [], [expout], [])
|
|
|
|
AT_CLEANUP
|