delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2002/02/07/15:21:58

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
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 <kent AT watsen DOT net>
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 <sk DOT mail AT btinternet DOT com>
Cc: cygwin AT cygwin DOT com
Subject: Re: dlopen(0, RTLD_LAZY) doesn't work?
References: <01c501c1b012$4be78ad0$01000001 AT sknet01>

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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019