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