Mail Archives: cygwin/2002/04/12/17:42:50
Hi,
Maybe I hadn't stated this well --
I need some help creating a dll which I can open and use dlopen and dlsym.
The description is below...
Could someone give me a pointer?
thanks!
>
> The problem seems to be in the -creation- of the dll.
>
> the instructions at http://cygwin.com/cygwin-ug-net/dll.html result in
> many link-time errors and the method I -was- using (see below) does not
> export the symbol I need.
>
> Any ideas?
from testdlopen.c clip *<
---------------------------------------------------------------------
>
> #include <dlfcn.h> /* dll support */
> #include <stdlib.h> // NULL
>
> #define MODULE_IMPORT_STR "mod_import"
>
> int main(int argc, char **argv) {
> char *mod_file_name = "test.dll";
> void *handle;
> void *mod;
> // void *import;
> char *err;
> void *(*import)();
>
> handle = dlopen(mod_file_name, (RTLD_NOW | RTLD_GLOBAL));
> if ((err = dlerror()) != NULL) {
> printf("Error [%s] in dlopen(%s, %d)\n", err, mod_file_name, (RTLD_NOW |
> RTLD_GLOBAL));
> exit(1);
> }
>
> if (handle != NULL) {
> /* handle now points to a valid lib */
> dlerror(); /* clear errors */
> import = dlsym(handle, MODULE_IMPORT_STR);
>
> if ((err = dlerror()) == NULL) {
> mod = (void *)(*import)(argv);
> if (mod != NULL) { /* import it */
> //mod->handle = handle;
> //mod->next = tsh_data.modules->next;
> //tsh_data.modules->next = mod;
> } else {
> printf("Error: execution of imported method failed\n");
> exit(0);
> }
> } else {
> printf("Error [%s] in dlsym(%ul, %s)\n", err, (unsigned int) handle,
> MODULE_IMPORT_STR);
> }
> }
>
> exit(0);
> }
> ------------------------------------- >8 clip testdlopen.c
>
from makefile.exe 8<
--------------------------------------------------------------------------
>
>
> CC=gcc
> INCLUDE=-I.
> CFLAGS=-Wall
> ifdef debug
> CFLAGS=-g -Wall -DDEBUG -rdynamic
> endif
> #LDFLAGS=-ldl -Wl,-export-dynamic
> LDFLAGS= -Wl,-export-dynamic
> OBJS=util.o output.o types.o hooks.o tsh.o basename.o
> SRCS=output.c types.c tsh.c hooks.c util.c modules.h types.h basename.c
>
> tsh: $(OBJS)
> $(CC) $(LDFLAGS) -o tsh $(OBJS)
>
> testdlopen: testdlopen.o
> $(CC) $(LDFLAGS) -o testdlopen testdlopen.o
>
> testdlopen.o: testdlopen.c
> $(CC) $(INCLUDE) $(CFLAGS) -c testdlopen.c
> ---------------------------------------- >8 clip makefile.exe
The run of testdlopen.exe
Error [dlsym: Win32 error 127] in dlsym(438501376l, mod_import)
>
>
> from makefile.dll clip 8<-----------------------------
> # This creates a dll without the exports I need - see def below
> TARGET=simpletest
> DLL_SUFF=.dll
> LIB_SUFF=.a
> DLL_EXP_LIB =$(TARGET)$(DLL_SUFF)$(LIB_SUFF)
> DLL_NAME=$(TARGET)$(DLL_SUFF)
> DLL_LDFLAGS=-Wl,--export-all-symbols
> INCLUDE=
>
> simpletest.dll: Makefile simpletest.o
> gcc -shared -Wl,--out-implib=$(DLL_EXP_LIB) -o $(DLL_NAME)
> $(DLL_OBJS) $
> (DLL_LDFLAGS) $(DLL_LDLIBS) -Wl,--export-all-symbols
> dlltool --def simpletest.def --dllname simpletest.dll --output-lib
> simpl
> etest.a
>
> #-Wl,simpletest.def
> simpletest.o: simpletest.c ../../modules.h ../../global.h ../../types.h
> $(CC) $(INCLUDE) -c simpletest.c
> ------------------------------------- >8 clip makefile
>
> from test.def clip 8< ----------------------------------------
> EXPORTS
> mod_import
> ------------------------------------ >8 clip test.def
>
> from simpltest.c 8< ---------------------------------------------------
>
> void *foo();
> void *(*export_foo)() = foo;
> void *mod_import(char **argv) {
> return export_foo;
> }
>
> char *hello = "hello world";
> void *foo() {
> return (void *) hello;
> }
> ------------------------------------ >8 clip test.c
> from nm simpletest.dll | grep T clip 8< ------------------------------
> 100010f4 T _DllMain AT 12
> 100012a4 T _GetModuleHandleA AT 4
> 100012ac T __CTOR_LIST__
> 100012b4 T __DTOR_LIST__
> 100012ac T ___CTOR_LIST__
> 100012b4 T ___DTOR_LIST__
> 1000113c T __cygwin_crt0_common AT 8
> 10001024 T __cygwin_dll_entry AT 12
> 100010d4 T __cygwin_noncygwin_dll_entry AT 12
> 10001000 T __end__
> 1000125c T _calloc
> 1000110c T _cygwin_attach_dll
> 10001104 T _cygwin_detach_dll
> 1000129c T _cygwin_internal
> 10001294 T _cygwin_premain0
> 1000128c T _cygwin_premain1
> 10001284 T _cygwin_premain2
> 1000127c T _cygwin_premain3
> 10001254 T _dll_dllcrt0
> 10001000 T _end
> 1000126c T _free
> 10001274 T _malloc
> 10001264 T _realloc
> 10001000 T end
> 100012bc T etext
> --------------------------------------------- >8 nm output
>
> Notice the -lack- of mod_import!!!
>
> Thanks !!!!
>
--
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/
- Raw text -