Subject: Re: dlopen(0, RTLD_LAZY) doesn't work?
From: PsychoSphere <[email-masked]>
To: [email-masked]
Cc: [email-masked]
Date: Fri, 8 Feb 2002 02:52:24 -0800 (PST)

This is wrong... the .def file is never used when gcc
is not linking a shared lib. You can see this by using
a nonsense .def file, no errors are reported unless
-shared is used.

I believe the __declspec(...) has a similar effect, in
that it is ignored unless -shared is specified, or
-mdll is used.

Also, the dllimport directive is never used unless an
import library is created and used, which is not the
idea here.

I would suggest trying to used gcc and ld manually at
each stage of the build. I will attempt this sometime
today...

The problem i beleive, is that gcc is unaware that the
exe is going to be opened as a shared lib. I have some
assembler code that one could insert before the
function definition to force the symbol to be
exported. I will post it when I get to my computer.

Stephano Mariani

Well, I think the problem is that you specify
__declspec(dllexport) in
the function declaration. If you do this then you're
supposed to do
extern __declspec(dllimport) void foo(void) in the
source file
which uses this function. If you want to use load
library you have to
remove the __declspec(dllexport) and replace it with
an .def with
EXPORTS section, then you list the exports in the .def
file.

just my 0.02 euro cents :P

Larry Hall (RFK Partners, Inc) wrote:

> I've never seen this attempted to access a function
not in a DLL, though
> in theory (at least), what you're doing should work.
 
> 
> Check the symbols in the resulting object file. 
Make sure that the call
> type is the same as you're referencing the function
by.  In other words,
> make sure that you call the function by the name as
the object file has
> it (probably stdcall) rather than the name as you
write it (cdecl).  
> Change your definition call type or the calling name
itself so that the 
> call type matches.  This might help.
> 
> Larry Hall                             
[email-masked]
> RFK Partners, Inc.                     
http://www.rfk.com
> 838 Washington Street                   (508)
893-9779 - RFK Office
> Holliston, MA 01746                     (508)
893-9889 - FAX
> 
> 
> 
> At 09:57 PM 2/6/2002, Kent Watsen wrote:
> 
> 
>>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/
> 
> 
> 
> 

--
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/

__________________________________________________
Do You Yahoo!?
Send FREE Valentine eCards with Yahoo! Greetings!
http://greetings.yahoo.com

--
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/