ну елки палки ..
в библиотеке пусть будет переменная типа
void *some_external_data;
в той части которая делает dlopen() будет такой кусок
void *handler;
void **sedp;
handler = dlopen(...);
/* TODO: checks */
sedp = dlsym(handler, "some_external_data");
if (sedp == NULL) {
/* TODO: no such symbol err */
}
*sedp = handler;
после этого some_external_data будет не чем иным как этот хендлер.
man dlsym
> Дело в том, что мне нужно знать этот handler уже при инициализации
> иблиотеки, т.е. в функции _init().
вся твоя специфика только в том что у тебя в либе нет символа _init,
_fini или есть но реальную работу делают другие функции которые будет
вызваны из `load_file' и `unload_file' если ты конечно планируешь их
написать.
примеры:
int
load_file(char *ofile)
{
handler = dlopen(ofile, RTLD_NOW);
if (handler == NULL)
return -1;
mname = dlsym(handler, "modulename");
if (mname == NULL) {
dlclose(handler);
return -1;
}
len = strlen(mname);
entry = (char*)malloc(len + 16);
if (entry == NULL) {
dlclose(handler);
return -1;
}
sedp = dlsym(handler, "some_external_data");
if (sedp == NULL) {
/* TODO: no such symbol err */
}
*sedp = handler;
/* finally call _init func */
snprintf(entry, len + 15, "%s_init", mname);
mini = dlsym(handler, entry);
if (mini != NULL)
(*mini)();
free(entry);
return 0;
}
/* lib example */
char modulename[]="test";
void *some_external_data;
/* will be called in `load_file' */
void
test_init(void)
{
printf("%s: %s: init test passed, handler=%p\n", \
__FILE__, __FUNCTION__, some_external_data);
}
/* will be called in `unload_file' */
void
test_fini(void)
{
printf("fini\n");
}
....
....
Дело не в этом. Дело в том, что делается некая программа, которая создает динамические библиотеки. Библиотеки специфичны, должны инициироваться каждая по-своему, и каждая из них при инициализации должна знать handle, которым потом будет оперировать и пользователь. Библиотеки-то могут использоваться сторониними пользователями.
> Дело не в этом. Дело в том, что делается некая программа, которая
> создает динамические библиотеки. Библиотеки специфичны, должны
> инициироваться каждая по-своему, и каждая из них при инициализации
> должна знать handle, которым потом будет оперировать и
> пользователь. Библиотеки-то могут использоваться сторониними
> пользователями.
напиши либу типа openlib в которой будут твои функции load_file и
unload_file которые будут использовать сторонние пользователи а прога
будет генерить "правильные" либы чтобы они правильно работали с твоими
load_file и unload_file. и будут эти либы инициироваться по своему
.. у каждой свой _init - только разные libname или modulename.
Если все это не подходит то поспешу тебя огорчить .. .so это не .dll
из so ты никогда не увидишь символы вызывающей стороны(в винде
можно). С другой стороны вызывающая сторона видит как свои так и
.soшные символы .. так что .so без работы вызывающей стороны никогда
не узнает про тот handle который она держит.