delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2002/02/08/14:04:07

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
From: "Stephano Mariani" <sk DOT mail AT btinternet DOT com>
To: "'Charles Wilson'" <cwilson AT ece DOT gatech DOT edu>
Cc: <cygwin AT cygwin DOT com>
Subject: RE: dlopen(0, RTLD_LAZY) doesn't work?
Date: Fri, 8 Feb 2002 19:03:33 -0000
Message-ID: <017801c1b0d3$4e315b10$8000a8c0@sknet01>
MIME-Version: 1.0
X-Priority: 1 (Highest)
X-MSMail-Priority: High
X-Mailer: Microsoft Outlook, Build 10.0.2616
In-Reply-To: <3C63FD5E.1010404@ece.gatech.edu>
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Importance: High

That is because all dlopen calls are in RTLD_LAZY equivalent mode. The
win32 api does not even support any other mode. The fact that a DLL can
be dlopend the way that we are trying to NULL (which should resolve to
itself) shows that it is possible. The second argument to dlopen is only
available so as not to break existing packages. I have recently posted a
thread about RTLD_GLOBAL mode. See the ML archives.

Stephano Mariani

-----Original Message-----
From: cygwin-owner AT cygwin DOT com [mailto:cygwin-owner AT cygwin DOT com] On Behalf
Of Charles Wilson
Sent: Friday, 8 February 2002 4 31
To: Stephano Mariani
Cc: cygwin AT cygwin DOT com
Subject: Re: dlopen(0, RTLD_LAZY) doesn't work?

Use the (kernel) source, luke.

In winsup/cygwin/include/dlfcn.h, you see a comment that "the following 
don't exist in win32 API".  Since cygwin's dlopen stuff is built on top 
of windows shared lib (DLL) support, the definitions which appear in 
that header file:

#define RTLD_LAZY   1
#define RTLD_NOW    2
#define RTLD_GLOBAL 4

have zero effect in cygwin's dlopen.

Even better, looking at winsup/cygwin/dlfcn.cc, you can see that the 
function definition doesn't even assign the second argument to a
variable:

void *
dlopen (const char *name, int)
{
...
}

RTLD_LAZY is not supported. QED.

--Chuck


Stephano Mariani wrote:

> In my experience, this is probably because the linker (or cc1) insists
> on eliminating "dead code", since it is never (directly) called.
> 
> I have managed to overcome this by using:
> 
> #include <stdio.h>
> #include <dlfcn.h>
> #include <windows.h>
> 
> __declspec(dllexport) void foo(void)
> {
>    printf("hello\n");
> }
> 
> int main(int argc, char *argv[])
> {
>    void* dl    = NULL;
>    void* func = NULL;
> 
>    dl = dlopen(0 , RTLD_LAZY);
>    if (dl == NULL) {
>        printf("dlopen() failed\n");
>        exit(0);
>    }
> 
>    func = dlsym(dl, "foo");
>    if (func == NULL) {
>        printf("dlsym() failed\n");
>        exit(0);
>    }
> 
>    printf("do something meaningful\n");
> 
>    dlclose(dl);
>    return 0;
> }
> 
> and compiling with first:
> gcc -mdll foo.c -c -o ...
> then linking without -mdll:
> gcc foo.o ... -o foo
> 
> 
> Note: I have not tried this, but I have previously used
> dlopen(NULL,RTLD_LAZY) successfully. Also, I do not think that you can
> call printf() without first attaching to the console within your
> dlopened routine.
> 
> Stephano Mariani
> 
> -----Original Message-----
> From: cygwin-owner AT cygwin DOT com [mailto:cygwin-owner AT cygwin DOT com] On
Behalf
> Of Kent Watsen
> Sent: Thursday, 7 February 2002 2 57
> To: cygwin AT cygwin DOT com
> Subject: Re: dlopen(0, RTLD_LAZY) doesn't work?
> 
> 
> OK, so I've written the windows equivalent of my original program
> and still get the same error - is there some linking option I'm
missine?
> 
> Here is the new code, again just compile (gcc foo.c) and run
(foo.exe):
> 
> #include <stdio.h>
> #include <windows.h>
> 
> extern __declspec(dllexport) void foo(void)
> {
>     printf("hello\n");
> }
> 
> int main(int argc, char *argv[])
> {
>     void* dl   = NULL;
>     void* func = NULL;
> 
>     dl = (void *) GetModuleHandle (NULL);
>     if (dl == NULL) {
>         printf("GetModuleHandle() failed\n");
>         exit(0);
>     }
> 
>     func = (void*)GetProcAddress((HMODULE)dl, "foo");
>     if (func == NULL) {
>         printf("GetProcAddress() failed (code %u)\n", GetLastError());
>         exit(0);
>     }
> 
>     printf("do something meaningful\n");
> 
>     return 0;
> }
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Kent Watsen wrote:
> 
> 
>>Hi,
>>
>>I've read the mailing list archives and searched google trying
>>to figure out how to get the following program to work.  All
>>you have to do is save it to a file (foo.c), compile (gcc foo.c),
>>and run - I always get "dlsym() failed."
>>
>>Note, I have tried many variations of extern and _declspec
>>as well as looking for "_foo" in addition to "foo" ("nm a.exe |
>>grep foo" returned "0040104c T _foo"...
>>
>>Here is the code - help would be greatly appreciated - thanks!
>>
>>#include <stdio.h>
>>#include <dlfcn.h>
>>#include <windows.h>
>>
>>extern __declspec(dllexport) void foo(void)
>>{
>>   printf("hello\n");
>>}
>>
>>int main(int argc, char *argv[])
>>{
>>   void* dl    = NULL;
>>   void* func = NULL;
>>
>>   dl = dlopen(0 , RTLD_LAZY);
>>   if (dl == NULL) {
>>       printf("dlopen() failed\n");
>>       exit(0);
>>   }
>>
>>   func = dlsym(dl, "foo");
>>   if (func == NULL) {
>>       printf("dlsym() failed\n");
>>       exit(0);
>>   }
>>
>>   printf("do something meaningful\n");
>>
>>   dlclose(dl);
>>   return 0;
>>}
>>
>>
>>
>>
>>-- 
>>Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
>>Bug reporting:         http://cygwin.com/bugs.html
>>Documentation:         http://cygwin.com/docs.html
>>FAQ:                   http://cygwin.com/faq/
>>
>>
> 
> 
> 
> --
> Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
> Bug reporting:         http://cygwin.com/bugs.html
> Documentation:         http://cygwin.com/docs.html
> FAQ:                   http://cygwin.com/faq/
> 
> 
> 
> 
> --
> Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
> Bug reporting:         http://cygwin.com/bugs.html
> Documentation:         http://cygwin.com/docs.html
> FAQ:                   http://cygwin.com/faq/
> 
> 



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/




--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


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