Могу ли я динамически связывать библиотеки, которые имеют дублированные имена функций? - PullRequest
0 голосов
/ 11 октября 2018

Представьте, что Library1.so и Library2.so имеет:

func1(), func2(), glob_data1, glob_data2  


Ситуация:
Я хочу использовать func1() и glob_data1 в Library1 ,
и одновременно использовать func2() и glob_data2 в Library2 .


Вопрос:
Как я могу это сделать, когда я динамически связываю эти библиотеки?
(Если нет возможности включитьУровень C, есть ли возможный способ на уровне сборки?)

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Представьте, что Library1.so и Library2.so имеют: func1(), func2(), glob_data1, glob_data2

Как правило, очень плохая идея загружать обе библиотеки в один процессв Linux (и других системах UNIX).

Когда, например, func1 из library1 вызывает func2, какой func2 вызывается?Ответ зависит от того, как именно были связаны библиотеки, как они были загружены и в каком порядке.

Если функции не вызывают никаких других экспортируемых символов, вы можете вызвать их черезуказатель на функцию, полученный из dlopen и dlsym:

void *h1 = dlopen("Library1.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L1)(void) = dlsym(h1, "func1");

void *h2 = dlopen("Library2.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L2)(void) = dlsym(h2, "func1");

printf("func1 from Library1 returns %d\n", f1L1());
printf("func1 from Library2 returns %d\n", f1L2());
0 голосов
/ 11 октября 2018

Если эти символы не предназначены для использования вне библиотек, вы можете просто пометить их как __attribute((visibility("hidden"))) (или, что еще лучше, скомпилировать код с помощью -fvisibility=hidden и аннотировать публичные функции с помощью __attribute((visibility("default")))).

Если эти функции должны оставаться открытыми, вы можете связать свои библиотеки с флагом -symbolic.Это заставит компоновщик разрешать ссылки на локальные определения (а не на заглушки PLT), когда это возможно.

Обратите внимание, что -symbolic применяется к всем символам библиотеки.Можно добиться того же эффекта для подмножества символов, используя псевдонимы символов, но это более сложный процесс, поэтому я бы не стал вдаваться в подробности, если он вам действительно не нужен.

...