dlopen(0, RTLD_LAZY) doesn't work?
Pavel Tsekov
ptsekov@syntrex.com
Fri Feb 8 00:44:00 GMT 2002
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/
More information about the Cygwin
mailing list