LINUX.ORG.RU

ну елки палки ..

в библиотеке пусть будет переменная типа
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

lg ★★
()

pthreads: ожидание нескольких семафоров

Дело в том, что мне нужно знать этот handler уже при инициализации иблиотеки, т.е. в функции _init().

JekLove
() автор топика

Должно решаться через интерфейс ld.so.
Во фряхе есть /usr/include/link.h, не знаю, как он называтся в линуксе.

anonymous
()

> Дело в том, что мне нужно знать этот 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");
}
....
....

lg ★★
()

Дело не в этом. Дело в том, что делается некая программа, которая создает динамические библиотеки. Библиотеки специфичны, должны инициироваться каждая по-своему, и каждая из них при инициализации должна знать handle, которым потом будет оперировать и пользователь. Библиотеки-то могут использоваться сторониними пользователями.

JekLove
() автор топика

> Дело не в этом. Дело в том, что делается некая программа, которая > создает динамические библиотеки. Библиотеки специфичны, должны > инициироваться каждая по-своему, и каждая из них при инициализации > должна знать handle, которым потом будет оперировать и > пользователь. Библиотеки-то могут использоваться сторониними > пользователями.

напиши либу типа openlib в которой будут твои функции load_file и unload_file которые будут использовать сторонние пользователи а прога будет генерить "правильные" либы чтобы они правильно работали с твоими load_file и unload_file. и будут эти либы инициироваться по своему .. у каждой свой _init - только разные libname или modulename.

Если все это не подходит то поспешу тебя огорчить .. .so это не .dll из so ты никогда не увидишь символы вызывающей стороны(в винде можно). С другой стороны вызывающая сторона видит как свои так и .soшные символы .. так что .so без работы вызывающей стороны никогда не узнает про тот handle который она держит.

так что выбирай.

lg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.