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