Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15506.22794.773470.123283@mango.psc.edu> Date: Fri, 15 Mar 2002 15:26:50 -0500 From: Greg Hood To: cygwin AT cygwin DOT com Subject: Re: dlopen error with nested dll's In-Reply-To: <15497.17766.680903.327350@mango.psc.edu> References: <15497 DOT 17766 DOT 680903 DOT 327350 AT mango DOT psc DOT edu> X-Mailer: VM 7.00 under Emacs 20.7.1 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 >#include >#include > >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 > >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/