- update for test7-win32dll

This commit is contained in:
Bryce Denney 2002-10-14 21:06:47 +00:00
parent c0f2cfe189
commit d0b169eaba

View File

@ -1,48 +1,55 @@
test6-execsymbols2
test7-win32dll
Try again to allow the module to reference symbols in the executable.
But this time, eliminate direct symbol references from the executable
to the module, so that the executable can be linked first. I believe
this will work ok for win32 and it's closer to how plugins need to work.
What I think I learned from test5:
> DLLs don't allow any symbols to be undefined at link time. So you have to
> choose the order of how to build things so that each link is complete.
> For a DLL that's used as a shared library, it must be built and linked on
> its own (without the program), with symbols exported. This link must be
> complete, so it can't depend on pieces from the program. Then, the
> program can be linked with the DLL, with the program reading symbols from
> the DLL. It can't go both ways.
>
> For a plugin environment, we want the plugin to be able to call functions
> in the main code, without putting every single thing as a function pointer.
> So the main executable should be built first, with appropriate symbols
> exported, and then the plugin can import those symbols. The main
> executable will find symbols in the DLL using lt_dlopen() and lt_dlsym(),
> which probably maps to LoadLibrary() and GetProcAddress().
This is similar to test6, but Psyon helped me port the main.cc code to
use LoadLibrary/GetProcAddress and make a Makefile that actually works.
module1.lo: In function `module_init(void)':
/home/bryce/bochs-testing/plugin-test/test6-execsymbols2/module1.cc:7: undefined reference to `import stub for register_module(char const *)'
---------------------
ltdl error
Program received signal SIGSEGV, Segmentation fault.
tryall_dlopen_module (handle=0x78f928, prefix=0x0, dirname=0x0,
dlname=0x100d2118 "cygmodule1-0.dll") at ltdl.c:1958
1958 if (dirname[dirname_len -1] == '/')
Current language: auto; currently c
(gdb) where
#0 tryall_dlopen_module (handle=0x78f928, prefix=0x0, dirname=0x0,
dlname=0x100d2118 "cygmodule1-0.dll") at ltdl.c:1958
#1 0x1000249b in find_module (handle=0x78f928, dir=0x0, libdir=0x100d2190
"/home/bryce/bochs-testing/plugin-test/test6-ltdlopen/lib",
dlname=0x100d2118 "cygmodule1-0.dll", old_name=0x100d2130 "libmodule1.a",
installed=0) at ltdl.c:2024
#2 0x100035f8 in try_dlopen (phandle=0x78f958,
filename=0x78f98c "libmodule1.la") at ltdl.c:2798
#3 0x100038a5 in lt_dlopen (filename=0x78f98c "libmodule1.la") at ltdl.c:2893
#4 0x10001143 in load_module (fmt=0x100011fc "lib%s.la",
name=0x100011f4 "module1") at main.cc:19
#5 0x100012bb in main (argc=1, argv=0x100d0e60) at main.cc:46
I found that even for a trivial example I cannot make a working executable
with main in a DLL. Try making libmain a static library. But then would
every module link in all the code, or still use an implementation lib?
Standard build:
/bin/sh.exe ../libtool g++ -mno-cygwin -g -c main.cc
/bin/sh.exe ../libtool g++ -mno-cygwin -no-undefined -g -o libmain.la main.lo -rpath `pwd`/lib
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmain.la `pwd`/lib
/bin/sh.exe ../libtool g++ -mno-cygwin -no-undefined -g -o uselib libmain.la
/bin/sh.exe ../libtool g++ -mno-cygwin -g -c module1.cc
/bin/sh.exe ../libtool g++ -mno-cygwin -no-undefined -g -o libmodule1.la module1.lo -rpath `pwd`/lib libmain.la
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmodule1.la `pwd`/lib
/bin/sh.exe ../libtool g++ -mno-cygwin -g -c module2.cc
/bin/sh.exe ../libtool g++ -mno-cygwin -no-undefined -g -o libmodule2.la module2.lo -rpath `pwd`/lib libmain.la
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmodule2.la `pwd`/lib
Try with libmain as a static lib.
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -g -c main.cc
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -no-undefined -g -o libmain.la main.lo
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmain.la `pwd`/lib
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -no-undefined -g -o uselib libmain.la
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -g -c module1.cc
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -no-undefined -g -o libmodule1.la module1.lo -rpath `pwd`/lib libmain.la
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmodule1.la `pwd`/lib
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -g -c module2.cc
/bin/sh.exe ../libtool g++ -ggdb -mno-cygwin -no-undefined -g -o libmodule2.la module2.lo -rpath `pwd`/lib libmain.la
mkdir -p lib bin
/bin/sh.exe ../libtool cp libmodule2.la `pwd`/lib
How to make an import library for cygmodule2-0.dll
dlltool --as=as --dllname cygmodule2-0.dll --def .libs/cygmodule2-0.dll-def --output-lib .libs/libimp-cygmodule2-0.a
dll-def file is:
EXPORTS
module_init @ 1 ;
n_operations @ 2 DATA ;
operate__Fii @ 3 ;