加载同一共享库的两个不同版本

我的情况与以下情况非常相似。 有libA.so ,根据一些编译时标志显示略有不同的行为(它是一个外部的lib,我不能修改源)。 然后,我有libB.so依赖于libA.so (用-DVALUE=1编译),在我的可执行文件中我依赖于libB.so ,以及libA.so ,但是使用-DVALUE=0编译。 但是,一旦我启动它,ld解析所有符号与libA.so版本之一,所以我的可执行文件和libB.so都使用相同的function。

有没有办法指定我只想使用其依赖项加载解析libB.so未定义符号? 我在构建libB.so时尝试使用-Wl,-Bgroup标志,但它没有改变任何东西。 我知道dlmopen可以在新的命名空间中加载库,但我想在启动时自动加载它。

我附加了一组重现行为的文件:

libA.so:

 #include  #define _STR(x) #x #define STR(x) _STR(x) #ifndef VALUE #define VALUE default #endif void func2() { printf(STR(VALUE) "\n"); } void func() { func2(); } 

libB.so:

 #include  extern void func(void); void b_func() { func(); } 

可执行文件:

 #include  extern void b_func(void); extern void func(void); int main() { func(); // should print "default" b_func(); // should print "other" } 

构建命令:

 gcc -fPIC -shared Ac -o libA.so gcc -fPIC -shared -DVALUE=other Ac -o libA2.so gcc -fPIC -shared Bc -L. -lA2 -o libB.so gcc main.c -L. -lA -lB -o main 

奇怪的是,它在OS X上运行良好。