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 From: "Stephano Mariani" To: "'Kent Watsen'" , Subject: RE: dlopen(0, RTLD_LAZY) doesn't work? Date: Thu, 7 Feb 2002 20:01:56 -0000 Message-ID: <01c501c1b012$4be78ad0$01000001@sknet01> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Priority: 1 (Highest) X-MSMail-Priority: High X-Mailer: Microsoft Outlook, Build 10.0.2616 In-Reply-To: <3C61ED02.3060204@watsen.net> X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Importance: High 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/