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 error with nested dll's


After digging through many web pages, I found the examples in dllhelpers
( http://www.neuro.gatech.edu/users/cwilson/cygutils/V1.1/dll-stuff/ )
to be very helpful.  The problem was related to how I was building the
dll's.  The way that works correctly for my test example is:
  gcc -g -c -o m.o m.c
  gcc -g -c -o a.o a.c
  gcc -shared -Wl,--out-implib=liba.dll.a -o a.dll a.o -Wl,--export-all-symbols
  gcc -g -c -o b.o b.c
  gcc -shared -Wl,--out-implib=libb.dll.a -o b.dll b.o liba.dll.a -Wl,--export-all-symbols
  gcc -g -o m.exe m.o

which gives the desired output:
  ./m.exe
  a called.
  b called.
  a called.

>I'm trying to dlopen a .dll which depends on another .dll, and
>am getting a "Win32 error 127".  I'm not totally sure I am building
>the dll's correctly, so that might be one source of the problem.
>This is with Cygwin version 1.3.10, gcc version 2.95.3-5,
>dlltool version 2.11.92, and Windows NT 4.0.
>
>Here is an example.  There are 3 source files: m.c, a.c, and b.c.
>a.c is used to build a.dll, which m.exe can dlopen without problems.
>However, b.c is used to build b.dll, but this depends on symbols in
>a.dll.  m.exe gets an error upon trying to dlopen b.dll.
>
>------------------------m.c--------------------------------------------
>#include <stdio.h>
>#include <dlfcn.h>
>#include <stdlib.h>
>
>main ()
>{
>  void *a_handle, *b_handle;
>  void (*a)(), (*b)();
>
>  if ((a_handle = dlopen("a.dll", RTLD_NOW)) == NULL)
>    {
>      printf("dlopen of a.dll failed: %s\n", dlerror());
>      exit(1);
>    }
>  if ((a = (void (*)()) dlsym(a_handle, "a")) == NULL)
>    {
>      printf("dlsym of a failed: %s\n", dlerror());
>      exit(1);
>    }
>  (*a)();
>
>  if ((b_handle = dlopen("b.dll", RTLD_NOW)) == NULL)
>    {
>      printf("dlopen of b.dll failed: %s\n", dlerror());
>      exit(1);
>    }
>  if ((b = (void (*)()) dlsym(b_handle, "b")) == NULL)
>    {      printf("dlsym of b failed: %s\n", dlerror());
>      exit(1);
>    }
>  (*b)();
>}
>
>------------------------end of m.c-------------------------------------
>------------------------a.c--------------------------------------------
>#include <stdio.h>
>
>void a()
>{
>  printf("a called.\n");
>}
>------------------------end of a.c-------------------------------------
>------------------------b.c--------------------------------------------
>#include "stdio.h"
>extern void a();
>
>void b()
>{
>  printf("b called.\n");
>  a();
>}
>------------------------end of b.c-------------------------------------
>
>I compile and run these with the following commands:
>gcc -g -c -o m.o m.c
>gcc -g -c -o a.o a.c
>gcc -shared -o a.dll a.o
>gcc -g -c -o b.o b.c
>echo EXPORTS > a.def
>nm a.dll | grep ' T _' | sed 's/.* T _//' >> a.def
>dlltool --def a.def --dllname a.dll --output-lib a.a
>gcc -shared -o b.dll b.o a.a
>gcc -g -o m.exe m.o
>
>./m.exe
>a called.
>dlopen of b.dll failed: dlopen: Win32 error 127
>
>Any idea what is going wrong, or what else to try?
>Thanks.
>--Greg Hood
>  Pittsburgh Supercomputing Center

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