Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Message-ID: <3C62E1D5.8020505@watsen.net> Date: Thu, 07 Feb 2002 12:21:41 -0800 From: Kent Watsen User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: Stephano Mariani Cc: cygwin AT cygwin DOT com Subject: Re: dlopen(0, RTLD_LAZY) doesn't work? References: <01c501c1b012$4be78ad0$01000001 AT sknet01> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit 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 >#include >#include > >__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 >#include > >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 >>#include >>#include >> >>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/