Christopher Faylor wrote:
>On Thu, Aug 05, 2004 at 09:09:40AM +0200, Peter Ekberg wrote:
>>I have read several messages stating that dlopen does not work for
dlls
>>that depend on cygwin1.dll.
>>(e.g. http://sources.redhat.com/ml/cygwin/2004-06/msg01056.html).
>>I have also understood that this is due to some structures not being
>>initialized in that case.
>>
>>Is this dlopen problem limited to non-cygwin apps? I.e. is it true
>>that an app that depends directly on the cygwin1.dll is incapable of
>>dlopening dlls that depend on cygwin1.dll?
>
>No, it is not true.  dlopen would be pretty worthless if it didn't work
>in a standard cygwin program.

Indeed. Knowing that it should work, I was inspired to do some more
tests.

The reason I asked is that the following results in a dll that can't be
dlopened:

foo.c:
------------8<---------------
__declspec(dllexport) int foo(int bar);

int foo(int bar)
{
        return bar;
}
------------8<---------------

Build commands:
$ gcc -c foo.c
$ dlltool --dllname pseudo_stubs.dll --exclude-symbols
[EMAIL PROTECTED],[EMAIL PROTECTED],[EMAIL PROTECTED],DllMainCR
[EMAIL PROTECTED],[EMAIL PROTECTED] --output-def foo.def  foo.o
$ dllwrap --dllname pseudo_stubs.dll --output-lib pseudo_stubs.dll.a
--def foo.def foo.o -L/usr/lib

However, further tests have shown that if I change the name pseudo_stubs
to foo in the above commands, it works like a charm. Like this:

$ gcc -c foo.c
$ dlltool --dllname foo.dll --exclude-symbols
[EMAIL PROTECTED],[EMAIL PROTECTED],[EMAIL PROTECTED],DllMainCR
[EMAIL PROTECTED],[EMAIL PROTECTED] --output-def foo.def  foo.o
$ dllwrap --dllname foo.dll --output-lib foo.dll.a --def foo.def foo.o
-L/usr/lib

I use this program to test whether the resulting dll works:

load.c
------------8<---------------
#include <stdio.h>
#include <dlfcn.h>

char *dlls[] = {
        "pseudo_stubs.dll",
        "foo.dll",
        NULL
};

int main(void)
{ 
        int i;
        void *res;
        
        for(i=0; dlls[i]; ++i) {
                printf("%s\t", dlls[i]);
                res=dlopen(dlls[i], RTLD_LAZY | RTLD_GLOBAL);
                if(!res)
                        printf("%s\n", dlerror());
                else
                        printf("ok\n");
        }

        return 0;
}
------------8<---------------

I build load.c with "gcc load.c -o load" and ./load produces this
output:
pseudo_stubs.dll                dlopen: Win32 error 998
foo.dll ok

Any help on this would be appreciated.

Cheers,
Peter Ekberg

Attachment: cygcheck.out
Description: cygcheck.out

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to