000
18.04.2007, 22:29 Uhr
FunnyDingo
|
Hallo zusammen,
ich muss schon wieder nerven. Ich verstehe hier etwas nicht. Ich öffne mit dlopen() eine .so und möchte auf eine Funktion zugreife. Das Funktioniert auch. Nun kommt das schöne: diese (C) Funktion (ich nenne sie npmRegister) soll zwei Function-Pointer übergeben bekommen, diese mit den Adressen zweier (C++) Funktionen füllen damit ich die in meinem Hauptprogramm verwenden kann.
Hauptgramm
C++: |
bool load() { struct dynlib dl; strcpy(dl.file, "xxx.so"); // nur temporär dl.handle = dlopen(dl.file, RTLD_NOW); if (dl.handle == NULL) throw yacexception("Can't open dynamic shared library '" + std::string(dl.file) + "'", __FILE__, __LINE__);
dl.symbol = dlsym(dl.handle, "npmRegister"); if (dl.symbol == NULL) throw yacexception("dlopen() error: " + std::string(dlerror()), __FILE__, __LINE__);
dl.func = (bool (*)(void(*)(), void(*)()))dl.symbol; void (*send)(); void (*listen)(); if (dl.func(send, listen) == false) throw yacexception("Can't register NPM in file '" + std::string(dl.file) + "'", __FILE__, __LINE__);
dlerror(); send(); listen(); return true; }
|
dnylib sieht so aus:
C++: |
struct dynlib { char file[256]; void *handle; void *symbol; bool (*func)(void(*)(), void(*)()); };
|
Hier das eingebundene .so
C++: |
#include <iostream> #include <string> #include "../error/error.h";
void listen() { std::cout << "listen() has been called" << std::endl; }
void send() { std::cout << "send() has been called" << std::endl; }
extern "C" { bool npmRegister(void(*pListen)(), void(*pSend)()) { pListen = listen; pSend = send; return true; } }
|
Wenn ich das laufen lasse, gibts nen SegFault. Hab mir das mit dem gdb mal angesehen, werde aber nicht schlau draus. Der ruft die send() auf, dann ein mcount() (wo auch immer die herkommt) und dann gibts den SegFault.
Vielleicht sieht ja jemand von euch meinen Fehler.
Gruß, Funny -- "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)
Meine Website: http://www.funnydingo.de Dieser Post wurde am 18.04.2007 um 22:33 Uhr von FunnyDingo editiert. |