Конфликт символов в транзитивных зависимостях двух динамических библиотек - PullRequest
0 голосов
/ 19 июня 2019

Я использую две сторонние динамические библиотеки: liba.so и libb.so. Они оба вызывают функцию с именем common, включенную в другую динамическую библиотеку, но liba.so должна использовать функцию из libsuba.so, а libb.so - функцию из libsubb.so.

У меня нет доступа к исходному коду этих динамических библиотек, и поэтому я не могу изменить имя функции одной библиотеки и перекомпилировать ее для разрешения конфликта.

Мне известно, что macOS предоставляет двухуровневое пространство имен, которое, похоже, решает проблему, но я не нашел ничего подобного в ld справочных страницах.

// exe.c
extern void func_a(void);
extern void func_b(void);

void main(void) {
    func_a();
    func_b();
}
// lib(a|b).c
extern void common(void);

void func_(a|b)(void) {
    common();
}
// libsub(a|b).c
#include <stdio.h>

void common(void) {
    printf("Common (A|B)\n");
}
all: exe

exe: exe.c liba.so libb.so
    gcc -L. -Wl,-rpath=. -o $@ $< -la -lb

liba.so: liba.c libsuba.so
    gcc -shared -fPIC -Wl,-rpath=. -L. -o $@ $< -lsuba

libb.so: libb.c libsubb.so
    gcc -shared -fPIC -Wl,-rpath=. -L. -o $@ $< -lsubb

libsub%.so: libsub%.c
    gcc -shared -fPIC -o $@ $<

Есть ли способ решить эту проблему?

Редактировать: текущее выходное значение:

$ ./exe 
Common A
Common A

и я хотел бы, чтобы результат был:

$ ./exe 
Common A
Common B

1 Ответ

1 голос
/ 20 июня 2019

Вы должны сообщить о проблеме соответствующим поставщикам этих библиотек.Я думаю, что им не хватает пространств имен для экспортируемых символов (наверняка, если libsuba и libsubb оба экспортируют символ, называемый «общий»).

Задумывались ли вы об использовании objcopy --redefine-sym (см. этот ответ )?Однако objcopy, похоже, не изменяет динамический символ talbe, что делает этот подход бесполезным: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...