>dlopen с первым параметром NULL откроет для тебя глобальную таблицу. в принципе можно сделать и через dlopen вот код, только он не работает ;-)) и там поясненно почему:
/*
НЕ РАБОТАЕТ!!!!
что бы так работало надо функции
sum и sub вынести в отдельный файл
func.c
скомплировать его как разделяемую библиотеку
gcc -c -fPIC -o func.o func.c
gcc -shared -fPIC -o libfunc func.o
а затем уже подсоединить при линковке эту библиотеку(если влом загружать ее динамически)
gcc -o call_func_dlopen call_func_dlopen.c -L. -lfunc
вот тогда, должно заработать ;-))
*/
#include <map>
#include <iostream>
#include <string>
#include <dlfcn.h>
using namespace std;
typedef int (*func)(int x, int y);
typedef map< string, func, less <string> > named_func_map;
class named_func {
private:
static void *libself;
static int count_use;
named_func_map nfm;
public:
named_func();
~named_func();
//void insert(string s, func f);
int run(string s, int v1, int v2);
};
void *named_func::libself = NULL;
int named_func::count_use = 0;
named_func::named_func() {
if(libself == NULL) {
libself = dlopen(NULL, RTLD_LAZY);
//libself = dlopen(NULL, RTLD_GLOBAL);
if (!libself) {
cerr << "Can't load symbols, " << dlerror() <<endl;
} else {
count_use++;
}
} else {
count_use++;
}
}
named_func::~named_func() {
if(libself != NULL) {
count_use--;
if(count_use <= 0) {
int res = dlclose(libself);
libself = NULL;
if(res != 0) {
cerr << "Error close selflib, " << res << endl;
}
}
}
}
int named_func::run(string s, int v1, int v2) {
func f;
int ret = 0;
void *rez = 0;
char *error;
if(libself == NULL) {
cerr << "Can't run " << s << ", library is not initialized!" << endl;
}
rez = dlsym(libself, s.c_str());
if ((error = dlerror()) != NULL) {
cerr << error << endl;
} else {
f = (func)rez;
ret = f(v1, v2);
}
return ret;
}
int sum(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x - y;
}
int main(int argc, char* argv[]) {
func f;
named_func nf;
//nf.insert("sum", sum);
//nf.insert("sub", sub);
cout << "Initialize succesful!" << endl;
//int s = f(1, 2);
std::cout << "Rezult sub 15 - 7 is: " << nf.run("sub", 15, 7) << std::endl;
std::cout << "Rezult sum 15 + 7 is: " << nf.run("sum", 15, 7) << std::endl;
return 0;
}