Subject: Re: dlopen(0, RTLD_LAZY) doesn't work?
From: Kent Watsen <[email-masked]>
To: Stephano Mariani <[email-masked]>
Cc: [email-masked]
Date: Thu, 07 Feb 2002 12:21:41 -0800

Hi Stephano,

I really appreciate your response!  I have tried your suggestion
without success - I still get the same result.

However, your comment about dead code elimination, I don't
think that this is the case here as 1) the function is in the same .o
and I thought linkers eliminated at the .o level and 2) I see
an entry for foo when I run "nm foo.exe | grep foo."

If its not too much trouble, could you *please* reference your
previous effort to see how you got this to work?

Thanks!
Kent

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: [email-masked] [mailto:[email-masked]] On Behalf
>Of Kent Watsen
>Sent: Thursday, 7 February 2002 2 57
>To: [email-masked]
>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/