两个动态库的传递依赖中的符号冲突
Symbol conflict in transitive dependencies of two dynamic libraries
我正在使用两个第三方动态库: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
您应将此问题报告给这些库的相应供应商。我认为它们缺少导出符号的名称空间(当然,如果 libsuba
和 libsubb
都导出一个名为 "common" 的符号)。
您是否考虑过使用 objcopy --redefine-sym
(参见 this answer)?然而,objcopy 似乎并没有修改动态符号表,导致这种方法无用:(
我正在使用两个第三方动态库: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
您应将此问题报告给这些库的相应供应商。我认为它们缺少导出符号的名称空间(当然,如果 libsuba
和 libsubb
都导出一个名为 "common" 的符号)。
您是否考虑过使用 objcopy --redefine-sym
(参见 this answer)?然而,objcopy 似乎并没有修改动态符号表,导致这种方法无用:(