[C++ Linux] Shared Objects Zugriff auf programminterne Objekte geben

_Grubi

Erfahrenes Mitglied
Hi,

ich habe für mein Programm ein kleines Plugin-System gebastelt, welches auf Shared Objects (so-Files) basiert. Im Programm selber gibt es z.B. ein Objekt, welches mir für das Senden von Daten über Sockets Buffer bereitstellt (bereits allozierte Speicherbreiche, die aus einem Pool kommen), auf die die Module zugreifen können sollen.

Nun habe ich das Problem, dass ich beim laden der so-Files via der dl-Library einen Speicherzugriffsfehler erhalte, was ich nur auf dieses Vorgehen von mir erklären kann.

Falls es wichtig ist, wie kompiliert wird, habe ich hier einmal mein Makefile (ist evt. noch etwas unprofessionell - arbeite noch nicht allzulange damit^^)
Bash:
PROGRAMM = ebn_taskbot
SRCS = *.c Network/*.c Modules/*.c
INC = -I./Includes/
INC_SQL =  -I../MySQLpp/include/mysql++ -I/usr/include/mysql
LIB = -L../MySQLpp/lib/
LIBs = -ldl -lpthread -lmysqlpp -lmysqlclient_r
OPTIMIZE = -O3




default: all

all: $(PROGRAMM)

$(PROGRAMM):
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed -DWITH_SQL_SUPPORT $(OPTIMIZE) $(INC) $(INC_SQL) -c Core.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed -DWITH_SQL_SUPPORT $(OPTIMIZE) $(INC) $(INC_SQL) -c MySQL.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Hooks.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Prelinked.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Loader.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Cleanup.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Utils.cpp
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Config/Config.cpp -o Config/Config.o

	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed -DWITH_SQL_SUPPORT $(OPTIMIZE) $(INC) $(INC_SQL) -c Network/Server.cpp -o Network/Server.o
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed -DWITH_SQL_SUPPORT $(OPTIMIZE) $(INC) $(INC_SQL) -c Network/ThreadPool.cpp -o Network/ThreadPool.o
	libtool --silent --mode=compile g++ -static -prefer-non-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Network/DataBuffer.cpp -o Network/DataBuffer.o

	
	libtool --silent --mode=link g++ -static -Wl,--as-needed $(OPTIMIZE) $(LIB) $(LIBs) -o out/lib/libcore.la Core.lo MySQL.lo Hooks.lo Prelinked.lo Modules.lo Loader.lo Utils.lo Cleanup.lo Config/Config.lo
	libtool --silent --mode=link g++ -static -Wl,--as-needed $(OPTIMIZE) -o out/lib/libnet.la Network/Server.lo Network/ThreadPool.lo Network/DataBuffer.lo

	
	libtool --silent --mode=link g++ -static -Wl,--as-needed $(OPTIMIZE) -o out/ebn_taskbot out/lib/libcore.la out/lib/libnet.la 

mods:	

	libtool --silent --mode=compile g++ -shared -prefer-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules/FTP.cpp -o Modules/FTP.o
	libtool --silent --mode=compile g++ -shared -prefer-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules/PHP.cpp -o Modules/PHP.o
	libtool --silent --mode=compile g++ -shared -prefer-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules/Space.cpp -o Modules/Space.o
	libtool --silent --mode=compile g++ -shared -prefer-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules/Domain.cpp -o Modules/Domain.o
	libtool --silent --mode=compile g++ -shared -prefer-pic -Wall -Wl,--as-needed $(OPTIMIZE) $(INC) -c Modules/CreateLog.cpp -o Modules/CreateLog.o
	
	libtool --silent --mode=link g++ -shared -Wl,--as-needed $(OPTIMIZE) -o out/mod/mod_ftp.so Modules/FTP.lo 
	libtool --silent --mode=link g++ -shared -Wl,--as-needed $(OPTIMIZE) -o out/mod/mod_php.so Modules/PHP.lo 
	libtool --silent --mode=link g++ -shared -Wl,--as-needed $(OPTIMIZE) -o out/mod/mod_space.so Modules/Space.lo 
	libtool --silent --mode=link g++ -shared -Wl,--as-needed $(OPTIMIZE) -o out/mod/mod_domain.so Modules/Domain.lo 
	libtool --silent --mode=link g++ -shared -Wl,--as-needed $(OPTIMIZE) -o out/mod/mod_createlog.so Modules/CreateLog.lo

Ich habe es auch schon mit "-module -avoid-version" statt "-shared" beim linken im Bereich mods in Verbindung mit "libtool -mode=install..." versucht - wie ich es irgendwo gelesen habe - bleibt beim gleichen Ergebnis.

Gibt es da wirklich keine Möglichkeit, wie ich auf Funktionen und Objecte in meinem Programm aus den Modulen heraus zugreifen kann? (Außer evt. dem Modul expliziet über einen Funktionsaufruf die Adressen mitzuteilen - ungetestet.)

Gruß,
grubi
 
Nach entlichen Stunden der Sucherrei bin ich durch Zufall über die Option " -rdynamic" für g++ gestoßen. Dadurch wier das Programm so kompiliert / ge-link-t, dass durch dlopen geladen so-Files auf programmeigene Objekte zugreifen können
 
Zurück