dlopen(0, RTLD_LAZY) doesn't work?
PsychoSphere
psychosphere2k@yahoo.com
Fri Feb 8 02:52:00 GMT 2002
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
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/
__________________________________________________
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/
More information about the Cygwin
mailing list