From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Peter O'Gorman Newsgroups: gmane.lisp.guile.bugs,gmane.comp.gnu.libtool.patches Subject: Re: Mac OS X .dylib not working Date: Sat, 05 Mar 2011 10:16:29 -0600 Message-ID: <4D7261DD.2010106@pogma.com> References: <4D705581.1030701@pogma.com> <24B671DD-89B7-4FBC-BDC5-39E6C058872E@telia.com> <4D712A62.2090901@pogma.com> <20110304184724.GL10500@gmx.de> <4D7136C4.7030600@pogma.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050807090402050308040304" X-Trace: dough.gmane.org 1299341813 11605 80.91.229.12 (5 Mar 2011 16:16:53 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 5 Mar 2011 16:16:53 +0000 (UTC) To: Hans Aberg , Guile bug , =?ISO-8859-1?Q?Ludovic_Court=E8s?= , Michael Ellis , libtool-patches@gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Sat Mar 05 17:16:48 2011 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Pvu9r-0001u8-CE for guile-bugs@m.gmane.org; Sat, 05 Mar 2011 17:16:44 +0100 Original-Received: from localhost ([127.0.0.1]:36122 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pvu9q-0005tG-Cp for guile-bugs@m.gmane.org; Sat, 05 Mar 2011 11:16:42 -0500 Original-Received: from [140.186.70.92] (port=52765 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pvu9j-0005rg-NP for bug-guile@gnu.org; Sat, 05 Mar 2011 11:16:37 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pvu9i-00012q-0N for bug-guile@gnu.org; Sat, 05 Mar 2011 11:16:35 -0500 Original-Received: from pogma.xen.prgmr.com ([68.68.97.8]:60080) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pvu9h-000125-IC; Sat, 05 Mar 2011 11:16:33 -0500 Original-Received: from tw.local (wnpgmb1316w-ds01-50-57.dynamic.mtsallstream.net [206.45.50.57]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by pogma.xen.prgmr.com (Postfix) with ESMTP id 83560BF5DB; Sat, 5 Mar 2011 16:16:39 +0000 (UTC) X-DKIM: Sendmail DKIM Filter v2.8.3 pogma.xen.prgmr.com 83560BF5DB DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=pogma.com; s=pogmail; t=1299341800; bh=uUKP3uYWd+Y8RgKceVw13K38umkf4m7mTHr5qxwKMQA=; h=Message-ID:Date:From:MIME-Version:To:Subject:References: In-Reply-To:Content-Type; b=CrtWmmzv/OeB7Jxpk3PVaeSIQQeEaTDpylcV0XvN8PRpAETZIld+3MscDrPxV9P/j dBVtgg/V9sl1BwifGnGxO733S+h4vmoScKR86pUBqhtVozB86uNeWkyEouQ2qp+sUM 4YvAYr7xUUSbXKCLTzqQrvN8H0/LzdBk3P2FFJJc= User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101209 Fedora/3.1.7-0.35.b3pre.fc13 Thunderbird/3.1.7 In-Reply-To: <4D7136C4.7030600@pogma.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 68.68.97.8 X-BeenThere: bug-guile@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:5286 gmane.comp.gnu.libtool.patches:11063 Archived-At: This is a multi-part message in MIME format. --------------050807090402050308040304 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/04/2011 01:00 PM, Peter O'Gorman wrote: > On 03/04/2011 12:47 PM, Ralf Wildenhues wrote: >>> +if test "$shlibpath_var" = PATH; then >> >> This looks wrong; shouldn't it be != here? Otherwise, ... Looking at the original test, the above is correct there - it wants to avoid messing with PATH on Windows. Pushed this. Thanks. Peter --------------050807090402050308040304 Content-Type: text/x-patch; name="0001-On-Mac-OS-X-try-.dylib-as-well-as-.so-with-lt_dlopen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-On-Mac-OS-X-try-.dylib-as-well-as-.so-with-lt_dlopen.pa"; filename*1="tch" >From e51daabd9975b141ed491f2f49bb340b797a6383 Mon Sep 17 00:00:00 2001 From: Peter O'Gorman Date: Fri, 4 Mar 2011 14:35:14 -0600 Subject: [PATCH] On Mac OS X try .dylib as well as .so with lt_dlopenext * libltdl/m4/ltdl.m4: Define extra extension if module extension differs from shared lib extension. * libltdl/ltdl.c: Use it. * tests/darwin.at: Test it. * NEWS: Announce it. Reported by Hans Aberg, Michael Ellis, and others. --- ChangeLog | 10 +++ NEWS | 3 + libltdl/ltdl.c | 21 +++++- libltdl/m4/ltdl.m4 | 9 ++- tests/darwin.at | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 257 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f74eab..528e404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2011-03-04 Peter O'Gorman + + On Mac OS X try .dylib as well as .so with lt_dlopenext + * libltdl/m4/ltdl.m4: Define extra extension if module extension + differs from shared lib extension. + * libltdl/ltdl.c: Use it. + * tests/darwin.at: Test it. + * NEWS: Announce it. + Reported by Hans Aberg, Michael Ellis, and others. + 2011-02-12 Peter O'Gorman Install ltmain.sh without execute bit set. diff --git a/NEWS b/NEWS index dbad2ae..90d14b7 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ New in 2.4.2 2011-??-??: git version 2.4.1a, Libtool team: - Initial support for Go, using the gccgo compiler. + - On Mac OS X .dylib is now tried as well as .so with + lt_dlopenext(). + * Bug fixes: - The generic approximation of the command line length limit (when getconf is diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index be1e4c0..01853e0 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -1,7 +1,7 @@ /* ltdl.c -- system independent dlopen wrapper Copyright (C) 1998, 1999, 2000, 2004, 2005, 2006, - 2007, 2008 Free Software Foundation, Inc. + 2007, 2008, 2011 Free Software Foundation, Inc. Written by Thomas Tanner, 1998 NOTE: The canonical source of this file is maintained with the @@ -80,6 +80,11 @@ static const char libprefix[] = LT_LIBPREFIX; #if defined(LT_MODULE_EXT) static const char shlib_ext[] = LT_MODULE_EXT; #endif +/* If the loadable module suffix is not the same as the linkable + * shared library suffix, this will be defined. */ +#if defined(LT_SHARED_EXT) +static const char shared_ext[] = LT_SHARED_EXT; +#endif #if defined(LT_DLSEARCH_PATH) static const char sys_dlsearch_path[] = LT_DLSEARCH_PATH; #endif @@ -1537,6 +1542,9 @@ has_library_ext (const char *filename) #if defined(LT_MODULE_EXT) || (streq (ext, shlib_ext)) #endif +#if defined(LT_SHARED_EXT) + || (streq (ext, shared_ext)) +#endif )) { return 1; @@ -1682,6 +1690,17 @@ lt_dlopenadvise (const char *filename, lt_dladvise advise) if (handle || ((errors > 0) && !file_not_found ())) return handle; #endif + +#if defined(LT_SHARED_EXT) + /* Try appending SHARED_EXT. */ + LT__SETERRORSTR (saved_error); + errors = try_dlopen (&handle, filename, shared_ext, advise); + + /* As before, if the file was found but loading failed, return now + with the current error message. */ + if (handle || ((errors > 0) && !file_not_found ())) + return handle; +#endif } /* Still here? Then we really did fail to locate any of the file diff --git a/libltdl/m4/ltdl.m4 b/libltdl/m4/ltdl.m4 index 42e07e9..ea76f4d 100644 --- a/libltdl/m4/ltdl.m4 +++ b/libltdl/m4/ltdl.m4 @@ -1,6 +1,6 @@ # ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- # -# Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. # Written by Thomas Tanner, 1999 # # This file is free software; the Free Software Foundation gives @@ -553,12 +553,19 @@ AC_CACHE_CHECK([which extension is used for runtime loadable modules], [ module=yes eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds ]) if test -n "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_MODULE_EXT])dnl AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], [Define to the extension used for runtime loadable modules, say, ".so".]) fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi ])# LT_SYS_MODULE_EXT # Old name: diff --git a/tests/darwin.at b/tests/darwin.at index 4e5034e..b255abe 100644 --- a/tests/darwin.at +++ b/tests/darwin.at @@ -228,3 +228,219 @@ mv stdout expout LT_AT_CONFIGURE([LDFLAGS=-L/there/is/no/dir/here]) AT_CHECK([./libtool --config],[ignore],[expout],[ignore]) AT_CLEANUP + +AT_SETUP([darwin can lt_dlopen .dylib and .so files]) + +AT_KEYWORDS([libltdl dylib]) + +# This test requires shared library support. +AT_CHECK([$LIBTOOL --features | grep 'enable shared libraries' || exit 77], + [], [ignore]) + +eval `$LIBTOOL --config | $EGREP '^shrext_cmds='` + +module=no +eval shared_ext=\"$shrext_cmds\" +module=yes +eval module_ext=\"$shrext_cmds\" + +# Only bother with this test if module extension is different from +# shared extension +AT_CHECK([test "$shared_ext" != "$module_ext" || exit 77]) + +# 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]) + +prefix=`pwd`/inst +libdir=$prefix/lib +bindir=$prefix/bin +mkdir $prefix $libdir $bindir + +# This code is copied from the Autobook: +# +# so if it needs changes, be sure to notify the Autobook authors +# about them. + +AT_DATA([simple-module.c], +[[ +#include + +#ifdef __cplusplus +extern "C" +#endif +int +run (const char *argument) +{ + printf ("Hello, %s!\n", argument); + return 0; +} +]]) + +AT_DATA([ltdl-loader.c], +[[ +#include +#include +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +# define EXIT_SUCCESS 0 +#endif + +#include +#ifndef PATH_MAX +# define PATH_MAX 255 +#endif + +#include +#include + +#ifndef MODULE_PATH_ENV +# define MODULE_PATH_ENV "MODULE_PATH" +#endif + +typedef int entrypoint (const char *argument); + +/* Save and return a copy of the dlerror() error message, + since the next API call may overwrite the original. */ +static char *dlerrordup (char *errormsg); + +int +main (int argc, const char *argv[]) +{ + char *errormsg = NULL; + lt_dlhandle module = NULL; + entrypoint *run = NULL; + int errors = 0; + + if (argc != 3) + { + fprintf (stderr, "USAGE: main MODULENAME ARGUMENT\n"); + exit (EXIT_FAILURE); + } + + /* Initialise libltdl. */ + errors = lt_dlinit (); + + /* Set the module search path. */ + if (!errors) + { + const char *path = getenv (MODULE_PATH_ENV); + + if (path != NULL) + errors = lt_dlsetsearchpath (path); + } + + /* Load the module. */ + if (!errors) + module = lt_dlopenext (argv[1]); + + /* Find the entry point. */ + if (module) + { + run = (entrypoint *) lt_dlsym (module, "run"); + + /* In principle, run might legitimately be NULL, so + I don't use run == NULL as an error indicator + in general. */ + errormsg = dlerrordup (errormsg); + if (errormsg != NULL) + { + errors = lt_dlclose (module); + module = NULL; + } + } + else + errors = 1; + + /* Call the entry point function. */ + if (!errors) + { + int result = (*run) (argv[2]); + if (result < 0) + errormsg = strdup ("module entry point execution failed"); + else + printf ("\t=> %d\n", result); + } + + /* Unload the module, now that we are done with it. */ + if (!errors) + errors = lt_dlclose (module); + + if (errors) + { + /* Diagnose the encountered error. */ + errormsg = dlerrordup (errormsg); + + if (!errormsg) + { + fprintf (stderr, "%s: dlerror() failed.\n", argv[0]); + return EXIT_FAILURE; + } + } + + /* Finished with ltdl now. */ + if (!errors) + if (lt_dlexit () != 0) + errormsg = dlerrordup (errormsg); + + if (errormsg) + { + fprintf (stderr, "%s: %s.\n", argv[0], errormsg); + free (errormsg); + exit (EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} + +/* Be careful to save a copy of the error message, + since the next API call may overwrite the original. */ +static char * +dlerrordup (char *errormsg) +{ + char *error = (char *) lt_dlerror (); + if (error && !errormsg) + errormsg = strdup (error); + return errormsg; +} +]]) + +: ${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 simple-module.c], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o simple-module.la ]dnl + [simple-module.lo -rpath $libdir -module -avoid-version], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o libsimple-dylib.la ]dnl + [simple-module.lo -rpath $libdir -avoid-version], + [], [ignore], [ignore]) +AT_CHECK([$CC $CPPFLAGS $CFLAGS -c ltdl-loader.c], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o ltdl-loader$EXEEXT ]dnl + [ltdl-loader.$OBJEXT -dlopen self $LIBLTDL], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=install cp simple-module.la $libdir/simple-module.la], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=install cp libsimple-dylib.la $libdir/libsimple-dylib.la], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=clean rm -f simple-module.la], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=clean rm -f libsimple-dylib.la], [], [ignore], [ignore]) + +rm $libdir/simple-module.la +rm $libdir/libsimple-dylib.la + +for dir in inst/lib "$libdir"; do + LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore], + [$dir/simple-module World]) + AT_CHECK([grep "Hello, World" stdout], [], [ignore]) + LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore], + [$dir/libsimple-dylib World]) + AT_CHECK([grep "Hello, World" stdout], [], [ignore]) +done + +AT_CLEANUP -- 1.7.3.4 --------------050807090402050308040304--