- add test6, which actually tries to open a shared lib with lt_dlopen.
For now I've been editing the Makefile directly and haven't updated the Makefile.in. Once it works I'll transfer everything to Makefile.in and remove Makefile.
This commit is contained in:
parent
eade765a53
commit
31b8154266
43
bochs-testing/plugin-test/test6-ltdlopen/Makefile
Normal file
43
bochs-testing/plugin-test/test6-ltdlopen/Makefile
Normal file
@ -0,0 +1,43 @@
|
||||
top_builddir = ..
|
||||
srcdir = .
|
||||
|
||||
|
||||
CXX=g++
|
||||
CXXFLAGS=-g -O2
|
||||
LDFLAGS= -no-undefined
|
||||
LIBS=-L`pwd`/../ltdl -lltdl
|
||||
LIBTOOL=$(SHELL) $(top_builddir)/libtool
|
||||
RPATH=`pwd`/lib
|
||||
|
||||
all: uselib libmodule1.la ### libmodule2.la
|
||||
|
||||
uselib: libmain.la
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o uselib libmain.la $(LIBS)
|
||||
|
||||
libmain.la: main.lo
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o libmain.la main.lo -rpath ${RPATH} $(LIBS)
|
||||
mkdir -p lib bin
|
||||
$(LIBTOOL) cp libmain.la ${RPATH}
|
||||
|
||||
libmodule1.la: module1.lo libmain.la
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o libmodule1.la module1.lo -rpath ${RPATH} libmain.la
|
||||
mkdir -p lib bin
|
||||
$(LIBTOOL) cp libmodule1.la ${RPATH}
|
||||
|
||||
libmodule2.la: module2.lo libmain.la
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o libmodule2.la module2.lo -rpath ${RPATH} libmain.la
|
||||
mkdir -p lib bin
|
||||
$(LIBTOOL) cp libmodule2.la ${RPATH}
|
||||
|
||||
%.lo: %.cc
|
||||
$(LIBTOOL) $(CXX) $(CXXFLAGS) -c $<
|
||||
|
||||
test:
|
||||
@echo "*** Running test in `pwd`"
|
||||
-./uselib
|
||||
@echo "*** Test done in `pwd`"
|
||||
|
||||
clean:
|
||||
-$(LIBTOOL) rm libmodule1.la module1.lo libmodule2.la module2.lo
|
||||
rm -rf *.o *.lo *.la uselib.exe bin lib uselib uselib.exe
|
||||
rm -rf .libs
|
37
bochs-testing/plugin-test/test6-ltdlopen/Makefile.in
Normal file
37
bochs-testing/plugin-test/test6-ltdlopen/Makefile.in
Normal file
@ -0,0 +1,37 @@
|
||||
top_builddir = ..
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
CXX=@CXX@
|
||||
CXXFLAGS=@CXXFLAGS@
|
||||
LDFLAGS=@LDFLAGS@ @LT_LDFLAGS@
|
||||
LIBTOOL=@LIBTOOL@
|
||||
RPATH=`pwd`/lib
|
||||
|
||||
all: uselib
|
||||
|
||||
uselib: uselib.cc libmodule1.la libmodule2.la
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o uselib $(srcdir)/uselib.cc libmodule1.la libmodule2.la
|
||||
|
||||
libmodule1.la: module1.lo libmodule2.la
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o libmodule1.la module1.lo -rpath ${RPATH} libmodule2.la
|
||||
mkdir -p lib bin
|
||||
$(LIBTOOL) cp libmodule1.la ${RPATH}
|
||||
|
||||
libmodule2.la: module2.lo
|
||||
$(LIBTOOL) $(CXX) $(LDFLAGS) -o libmodule2.la module2.lo -rpath ${RPATH}
|
||||
mkdir -p lib bin
|
||||
$(LIBTOOL) cp libmodule2.la ${RPATH}
|
||||
|
||||
%.lo: %.cc
|
||||
$(LIBTOOL) $(CXX) $(CXXFLAGS) -c $<
|
||||
|
||||
test:
|
||||
@echo "*** Running test in `pwd`"
|
||||
-./uselib
|
||||
@echo "*** Test done in `pwd`"
|
||||
|
||||
clean:
|
||||
-$(LIBTOOL) rm libmodule1.la module1.lo libmodule2.la module2.lo
|
||||
rm -rf *.o uselib.exe bin lib uselib uselib.exe
|
||||
rm -rf .libs
|
27
bochs-testing/plugin-test/test6-ltdlopen/README
Normal file
27
bochs-testing/plugin-test/test6-ltdlopen/README
Normal file
@ -0,0 +1,27 @@
|
||||
test6-execsymbols2
|
||||
|
||||
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().
|
||||
|
||||
|
||||
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 *)'
|
||||
|
52
bochs-testing/plugin-test/test6-ltdlopen/main.cc
Normal file
52
bochs-testing/plugin-test/test6-ltdlopen/main.cc
Normal file
@ -0,0 +1,52 @@
|
||||
#include <stdio.h>
|
||||
#include <ltdl.h>
|
||||
#define MAIN_DLL_EXPORT
|
||||
#include "main.h"
|
||||
|
||||
const char *version_string = "uselib-test6-1.0";
|
||||
|
||||
int register_module (const char *name)
|
||||
{
|
||||
printf ("register_module was called by module '%s'\n", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int load_module (const char *fmt, const char *name)
|
||||
{
|
||||
char buf[512];
|
||||
sprintf (buf, fmt, name);
|
||||
lt_dlhandle handle = lt_dlopen (buf);
|
||||
printf ("handle is %p\n");
|
||||
if (!handle) {
|
||||
printf ("lt_dlopen error: %s\n", lt_dlerror ());
|
||||
return -1;
|
||||
}
|
||||
modload_func func = (modload_func) lt_dlsym (handle, "_module_init");
|
||||
printf ("module_init function is at %p\n", func);
|
||||
if (func != NULL) {
|
||||
printf ("Calling module_init\n");
|
||||
(*func)();
|
||||
} else {
|
||||
printf ("lt_dlopen error: %s\n", lt_dlerror ());
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
printf ("start\n");
|
||||
printf ("loading module1\n");
|
||||
// try to load module1
|
||||
if (load_module ("%s", argv[1]) < 0) {
|
||||
printf ("load %s failed\n", argv[1]);
|
||||
}
|
||||
if (load_module ("%s.la", "module1") < 0) {
|
||||
printf ("load module1 failed\n");
|
||||
}
|
||||
if (load_module ("%s.la", "module2") < 0) {
|
||||
printf ("load module2 failed\n");
|
||||
}
|
||||
printf ("stop\n");
|
||||
return 0;
|
||||
}
|
21
bochs-testing/plugin-test/test6-ltdlopen/main.h
Normal file
21
bochs-testing/plugin-test/test6-ltdlopen/main.h
Normal file
@ -0,0 +1,21 @@
|
||||
#if defined(WIN32) || defined(__CYGWIN__)
|
||||
# ifdef MAIN_DLL_EXPORT
|
||||
# ifdef DLL_EXPORT
|
||||
# warning I will export DLL symbols for MODULE1
|
||||
# define MAINAPI(type) __declspec(dllexport) type
|
||||
# endif
|
||||
# else
|
||||
# warning I will import DLL symbols for MODULE1
|
||||
# define MAINAPI(type) __declspec(dllimport) type
|
||||
# endif
|
||||
#endif
|
||||
#ifndef MAINAPI
|
||||
# warning No DLL import/export is needed
|
||||
# define MAINAPI(type) type
|
||||
#endif
|
||||
|
||||
typedef void (*modload_func)(void);
|
||||
|
||||
MAINAPI(extern const char *) version_string;
|
||||
MAINAPI(extern int) register_module (const char *name);
|
||||
|
18
bochs-testing/plugin-test/test6-ltdlopen/module1.cc
Normal file
18
bochs-testing/plugin-test/test6-ltdlopen/module1.cc
Normal file
@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
#include "main.h"
|
||||
|
||||
extern "C" {
|
||||
// prevent C++ name mangling
|
||||
void module_init();
|
||||
};
|
||||
|
||||
void module_init ()
|
||||
{
|
||||
printf ("module1 init\n");
|
||||
register_module ("module1");
|
||||
}
|
||||
|
||||
int operate (int a, int b)
|
||||
{
|
||||
return a + b;
|
||||
}
|
15
bochs-testing/plugin-test/test6-ltdlopen/module2.cc
Normal file
15
bochs-testing/plugin-test/test6-ltdlopen/module2.cc
Normal file
@ -0,0 +1,15 @@
|
||||
#include <stdio.h>
|
||||
#include "main.h"
|
||||
|
||||
int n_operations = 0;
|
||||
|
||||
void module_init ()
|
||||
{
|
||||
printf ("module2 init\n");
|
||||
register_module ("module2");
|
||||
}
|
||||
|
||||
int operate (int a, int b)
|
||||
{
|
||||
return a - b;
|
||||
}
|
Loading…
Reference in New Issue
Block a user