LINUX.ORG.RU

импорт указателя по его имени


1

2

Есть приложение X, оно может быть слинковано статически с библиотекой A и с библиотекой B.

пусть в библиотеке A объявлена переменная int var; и она есть в таблице символов. И я хочу обратиться к ней из B, если X слинковано с A.

Если я просто напишу extern int var; но X с A не слинковано, то я получу ошибку.

Потому хотелось бы иметь что-то вида int *pvar = import_symbol(«var»);

что-то такое есть или нет?

★★★★★

Ответ на: комментарий от Elyas

она хочет имя файла. Не хотелось бы на него завязываться.

cvs-255 ★★★★★ ()
Последнее исправление: cvs-255 (всего исправлений: 1)

-rdynamic при компоновке и

int *pval = dlsym(RTLD_DEFAULT, "var");

kawaii_neko ★★★ ()
Ответ на: комментарий от kawaii_neko

динамическая компоновка не подходит.

Вкратце - это 2 nginx модуля и надо передать часть конфига одного в другой.

cvs-255 ★★★★★ ()
Ответ на: комментарий от kawaii_neko

К слову, нормальные люди решают такие проблемы препроцессорными define'ами на этапе компиляции.

kawaii_neko ★★★ ()
Ответ на: комментарий от cvs-255

динамическая компоновка не подходит.

Слушай, если ты не в курсе матчасти, кисо говорит тебе русским языком: к LDFLAGS (или то там у nginx) добавь "-rdynamic -ldl", а в своем коде используй dlsym. Когда это сработает, ты возможно прочитаешь man по gcc, dlsym. Может даже погуглишь, как устроен ELF и поймешь, почему это работает и что такое -rdynamic.

kawaii_neko ★★★ ()

Либо

$ cat test.c
extern int test __attribute__((weak));

int main ()
{
  printf("%p\n", &test);
}
$ cat symbol.c 
int test;
$ gcc test.c ; ./a.out 
(nil)
$ gcc test.c symbol.c ; ./a.out 
0x60090c
$ 
Либо скриптами сборки при выключении линковки с A определять макрос
#ifdef WITH_A
  int *pvar = &var;
#else
  int *pvar = NULL;
#endif

kim-roader ★★ ()

Есть приложение X, оно может быть слинковано статически с библиотекой A и с библиотекой B.

Ну раз все в статике, то решай проблему во время сборки, т е юзай тот же дефайн

AF ★★★ ()
Ответ на: комментарий от cvs-255

это 2 nginx модуля и надо передать часть конфига одного в другой.

Странное решение. Просто добавить функцию-геттер никак нельзя?

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