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

时间:2016-11-16 09:58:38

标签: c linker shared-libraries

我的情况与以下情况非常相似。有libA.so取决于一些编译时标志表现出略微不同的行为(它是一个外部lib,我无法修改源)。然后,我libB.so取决于libA.so(使用-DVALUE=1编译),在我的可执行文件中,我依赖于libB.so以及libA.so },但使用-DVALUE=0编译。但是,一旦我启动它,ld会使用libA.so个版本之一解析所有符号,因此我的可执行文件和libB.so都使用相同的函数。

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

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

libA.so:

#include <stdio.h>

#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 <stdio.h>

extern void func(void);

void b_func() {
    func();
}

可执行:

#include <stdio.h>

extern void b_func(void);
extern void func(void);

int main() {
    func();    // should print "default"
    b_func();  // should print "other"
}

构建命令:

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

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

0 个答案:

没有答案