链接库的多个版本

我有一个与第三方供应商VENDOR1的库X版本libfoo静态链接的应用程序。它还与来自第三方供应商VENDOR2的动态(共享)库libbar链接,该库静态链接了VENDOR1的libfoo版本Y。

因此libbar.so包含libfoo.a的Y版本,而我的可执行文件包含libfoo.x的X版本。libbar仅在内部使用libfoo,并且没有从我的应用程序传递到libbar的libfoo对象。

在构建时没有错误,但在运行时应用段错误。原因似乎是版本X使用了与版本Y不同大小的结构,并且运行时链接程序似乎混淆了哪个被哪个使用。

VENDOR1和VENDOR2均为封闭源,因此我无法重建它们。

有没有一种方法可以构建/链接我的应用程序,使其始终解析为版本X,而libbar始终解析为版本Y,并且两者永不混合?

回答:

感谢您的所有回复。我有一个似乎有效的解决方案。这是一个带有示例的详细问题。

在main.c中,我们有:

#include <stdio.h>

extern int foo();

int bar()

{

printf("bar in main.c called\n");

return 0;

}

int main()

{

printf("result from foo is %d\n", foo());

printf("result from bar is %d\n", bar());

}

在foo.c中,我们有:

extern int bar();

int foo()

{

int x = bar();

return x;

}

在bar.c中,我们有:

#include <stdio.h>

int bar()

{

printf("bar in bar.c called\n");

return 2;

}

编译bar.c和foo.c:

$ gcc -fPIC -c bar.c

$ gcc -fPIC -c foo.c

将bar.o添加到静态库中:

$ ar r libbar.a bar.o

现在使用foo.o创建一个共享库,并与静态libbar.a链接

$ gcc -shared -o libfoo.so foo.o -L. -lbar

编译main.c并与共享库libfoo.so链接

$ gcc -o main main.c -L. -lfoo

设置LD_LIBRARY_PATH以找到libfoo.so并运行main:

$ setenv LD_LIBRARY_PATH `pwd`

$ ./main

bar in main.c called

result from foo is 0

bar in main.c called

result from bar is 0

注意,将调用main.c中的bar版本,而不是链接到共享库中的版本。

在main2.c中,我们有:

#include <stdio.h>

#include <dlfcn.h>

int bar()

{

printf("bar in main2.c called\n");

return 0;

}

int main()

{

int x;

int (*foo)();

void *handle = dlopen("libfoo.so", RTLD_GLOBAL|RTLD_LAZY);

foo = dlsym(handle, "foo");

printf("result from foo is %d\n", foo());

printf("result from bar is %d\n", bar());

}

编译并运行main2.c(注意,我们不需要显式链接libfoo.so):

$ gcc -o main2 main2.c -ldl

$ ./main2

bar in bar.c called

result from foo is 2

bar in main2.c called

result from bar is 0

现在,共享库中共享库调用栏中的foo和main.c中的主调用栏中

我不认为这种行为是直观的,使用dlopen / dlsym的工作量更大,但这确实解决了我的问题。

再次感谢您的评论。

以上是 链接库的多个版本 的全部内容, 来源链接: utcz.com/qa/414215.html

回到顶部