delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2009/11/02/08:17:20

X-Recipient: archive-cygwin AT delorie DOT com
X-Spam-Check-By: sourceware.org
Date: Mon, 2 Nov 2009 14:16:56 +0100
From: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
To: cygwin AT cygwin DOT com
Subject: Re: Problem with dlopen()
Message-ID: <20091102131656.GF7831@calimero.vinschen.de>
Reply-To: cygwin AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
References: <c159f9ab0911011121q376d61ecye5fcd321c912633 AT mail DOT gmail DOT com>
MIME-Version: 1.0
In-Reply-To: <c159f9ab0911011121q376d61ecye5fcd321c912633@mail.gmail.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

On Nov  1 20:21, Juan Jose Garcia-Ripoll wrote:
> This function does some nonstandard things, but the most annoying one
> is imposing that the library to be loaded has to have a file
> extension.
> 
> If I invoke dlopen("/path/to/temp/dir/temporary_file", ...) then the
> routine fails with an error like "File or directory does not exist".
> It is probably not that text, but something similar output by
> dlerror(). If I rename the file as "temporary_file.foo" then dlopen()
> succeeds.
> 
> Using strace reveals that in the first case dlopen() is adding the
> extension ".dll" and complaining that the file does not exist. In
> addition to this, the file has to be given executable permissions
> using chmod() or dlopen will fail.
> 
> The reason I found this bug is that ECL (Embeddable Common Lisp)
> compiles lisp files to DLLs and uses nonstandard names for that. With
> mingw32 and Microsoft Visual Studio C++ we never had a problem, but
> cygwin broke when we used our code.

I'm somewhat puzzled by this, for two reasons:

- dlopen() uses LoadLibrary() under the hood.  With Mingw32 or VC++ you
  have to do the same, apparently.  LoadLibrary appends the .dll
  extension by itself(*) if the given filename has no extension.  So, if
  you had a shared lib called "foo", and you called LoadLibrary ("foo"),
  then you should have seen en error in MingW32/VC++.  Only by adding a
  trailing dot, you can avoid automative adding of the .dll suffix, same
  as in Cygwin's dlopen() function.

- If the library is not executable, the LoadLibrary function returns
  an "access denied" error.  You should have this observed, too.

Try this:

  $ cat > x.c << EOF
  #include <windows.h>
  #include <stdio.h>

  int main (int argc, char **argv)
  {
    HMODULE m = LoadLibrary (argv[1]);
    if (!m)
      printf ("%s: %lu\n", argv[1], GetLastError ());
    else
      printf ("Success\n");
    return 0;
  }
  EOF
  $ gcc x.c -o x
  $ cp /bin/cygncurses-9.dll ./xdll.dll
  $ ls -l xdll.dll
  -rwxr-xr-x 1 corinna vinschen 167936 2009-11-02 14:01 xdll.dll
  $ ./x xdll
  Success
  $ mv xdll.dll xdll
  $ ./x xdll
  xdll: 126
  $ net helpmsg 126

  The specified module could not be found.
 
  $ ./x xdll.        # Note the extra dot!
  Success
  $ chmod -x xdll
  $ ls -l xdll
  -rw-r--r-- 1 corinna vinschen 167936 2009-11-02 14:01 xdll
  $ ./x xdll.
  xdll.: 5
  $ net helpmsg 5

  Access is denied.

  $ mv xdll xdll.dll # Even with a dll suffix, you need execute permissions
  $ ./x xdll
  xdll: 5
  $ ./x xdll.dll
  xdll.dll: 5


Corinna

(*) http://msdn.microsoft.com/en-us/library/ms684175%28VS.85%29.aspx


-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019