This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: dlopen(0, RTLD_LAZY) doesn't work?


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                              lhall@rfk.com
> 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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]