libtool-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bad libdir entry in .la files on MSYS/MinGW


From: Peter Rosin
Subject: Bad libdir entry in .la files on MSYS/MinGW
Date: Wed, 04 Feb 2009 11:11:04 +0100
User-agent: Thunderbird 2.0.0.19 (Windows/20081209)

Hi!

While playing with func_to_host_path etc by Chuck, I noticed that the
libdir entry of installed .la files on MSYS/MinGW contains a path
in MSYS format. However, libltdl uses this path to locate the actual
module and that will always fail, since MinGW knows nothing about
MSYS paths. I think MSYS/MinGW usually gets by without this working
since libltdl also checks if the .la file *and* the module itself
have been moved, and thus often finds the module relative to where
it happened to find the .la file.

Attached testcase succeeds on Cygwin and fails on MSYS/MinGW.

Is this a sane test? Ok to push?

Cheers,
Peter

commit 209be0c004f0c88cc4cefdeb4438ee9a6125402b
Author: Peter Rosin <address@hidden>
Date:   Wed Feb 4 11:00:13 2009 +0100

    New test for libdir usage from within ltdl.
    
    * tests/ltdl-libdir.at: New test that checks if ltdl finds an
    installed module via the libdir variable in the .la file.
    * Makefile.am: Add above.

diff --git a/ChangeLog b/ChangeLog
index 5fe54d7..d9e5830 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-02-04  Peter Rosin  <address@hidden>
+
+       New test for libdir usage from within ltdl.
+       * tests/ltdl-libdir.at: New test that checks if ltdl finds an
+       installed module via the libdir variable in the .la file.
+       * Makefile.am: Add above.
+
 2009-02-03  Ralf Wildenhues  <address@hidden>
            Kurt Roeckx <address@hidden>
 
diff --git a/Makefile.am b/Makefile.am
index 574147d..2e1d3a3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -479,6 +479,7 @@ TESTSUITE_AT        = tests/testsuite.at \
                  tests/lt_dladvise.at \
                  tests/lt_dlopen.at \
                  tests/lt_dlopenext.at \
+                 tests/ltdl-libdir.at \
                  tests/ltdl-api.at \
                  tests/need_lib_prefix.at \
                  tests/standalone.at \
diff --git a/tests/ltdl-libdir.at b/tests/ltdl-libdir.at
new file mode 100755
index 0000000..46414ad
--- /dev/null
+++ b/tests/ltdl-libdir.at
@@ -0,0 +1,114 @@
+# ltdl-libdir.at -- test libltdl functionality             -*- Autotest -*-
+#
+#   Copyright (C) 2009 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.
+####
+
+AT_SETUP([libdir of installed modules])
+AT_KEYWORDS([libltdl])
+
+# This test requires shared library support.
+AT_CHECK([$LIBTOOL --features | grep 'enable shared libraries' || exit 77],
+        [], [ignore])
+
+prefix=`pwd`/inst
+libdir=$prefix/lib
+bindir=$prefix/bin
+mkdir $prefix $libdir $bindir
+
+AT_DATA([a.c],
+[[
+int f (void)
+{
+  return 42;
+}
+]])
+
+AT_DATA([m.c],
+[[
+#include <stdio.h>
+#include <ltdl.h>
+
+typedef int func_f(void);
+
+int
+main (int argc, const char *argv[])
+{
+  lt_dlhandle module = NULL;
+  func_f *f = NULL;
+
+  if (lt_dlinit()) {
+    fprintf(stderr, "lt_dlinit failed '%s'\n", lt_dlerror());
+    return 1;
+  }
+
+  module = lt_dlopen("a.la");
+
+  if (!module) {
+    fprintf(stderr, "lt_dlopen failed '%s'\n", lt_dlerror());
+    return 1;
+  }
+
+  f = (func_f *)lt_dlsym(module, "f");
+
+  if (!f) {
+    fprintf(stderr, "lt_dlsym failed '%s'\n", lt_dlerror());
+    return 1;
+  }
+
+  if (f() != 42) {
+    fprintf(stderr, "f did not return 42\n");
+    return 1;
+  }
+
+  lt_dlclose(module);
+  lt_dlexit();
+  return 0;
+}
+]])
+
+: ${LTDLINCL="-I$abs_top_srcdir/libltdl"}
+: ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"}
+
+CPPFLAGS="$LTDLINCL $CPPFLAGS"
+LDFLAGS="$LDFLAGS -no-undefined"
+
+AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c a.c],
+        [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o a.la ]dnl
+        [a.lo -rpath $libdir -module -shared -avoid-version],
+        [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c m.c],
+        [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o m$EXEEXT ]dnl
+        [m.$OBJEXT $LIBLTDL],
+        [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=install cp a.la $libdir/a.la],
+        [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=install cp m$EXEEXT $bindir/m$EXEEXT],
+        [], [ignore], [ignore])
+
+# Try finding the module via the libdir entry in a misplaced .la file.
+
+mv $libdir/a.la $bindir/a.la
+cd $bindir
+LT_AT_EXEC_CHECK([./m],
+                [], [ignore], [ignore])
+
+AT_CLEANUP

reply via email to

[Prev in Thread] Current Thread [Next in Thread]