加载同一共享库的两个不同版本
我的情况与以下情况非常相似。 有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上运行良好。