Mail Archives: cygwin/2002/02/07/15:21:58
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: 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/
- Raw text -