C 两个动态库的传递依赖中的符号冲突

C 两个动态库的传递依赖中的符号冲突,c,linux,linker,elf,dynamic-loading,C,Linux,Linker,Elf,Dynamic Loading,我正在使用两个第三方动态库:liba.so和libb.so。它们都调用另一个动态库中包含的名为common的函数,但是liba.so应该使用libsuba.so中的函数,而libb.so应该使用libsubb.so中的函数 我无法访问这些动态库的源代码,因此无法更改一个库的函数名并重新编译以解决冲突 我知道macOS提供了一个两级名称空间,似乎可以解决这个问题,但我在ld手册页中没有找到任何类似的名称空间 //exe.c 外部无效功能避免; 外部无效函数; 无效主无效{ func_a; func

我正在使用两个第三方动态库:liba.so和libb.so。它们都调用另一个动态库中包含的名为common的函数,但是liba.so应该使用libsuba.so中的函数,而libb.so应该使用libsubb.so中的函数

我无法访问这些动态库的源代码,因此无法更改一个库的函数名并重新编译以解决冲突

我知道macOS提供了一个两级名称空间,似乎可以解决这个问题,但我在ld手册页中没有找到任何类似的名称空间

//exe.c 外部无效功能避免; 外部无效函数; 无效主无效{ func_a; func_b; } //不列颠哥伦比亚省利巴 外部无效公共无效; 无效函数a | bvoid{ 常见的 } //利布苏巴|公元前 包括 无效公共无效{ printfCommon A | B\n; } 我希望输出为:

$ ./exe 
Common A
Common B

您应该向这些库的相应供应商报告该问题。我认为,如果libsuba和libsubb都导出一个名为common的符号,那么它们肯定缺少导出符号的名称空间

您是否考虑过使用objcopy-redefinesym-see?然而,objcopy似乎没有修改动态符号talbe,这使得这种方法毫无用处:

LD_PRELOAD=libsubb.so。另请参见和手册页。它强制公共函数为libsubb.so中的函数。我希望func_a使用libsuba.so和func_b中的公共函数libsubb.so.objcopy中的函数似乎只更新.symtab而不是.dynsym。我报告了这个问题,同时,我将尝试使用dlsym和RTLD_LOCAL加载两个库中的一个,希望根据dsohowto.pdf,查找范围不同。
$ ./exe 
Common A
Common A
$ ./exe 
Common A
Common B