可执行文件和依赖于相同静态链接库的共享库

时间:2014-04-17 12:40:44

标签: c++ linux shared-libraries static-libraries linkage

假设您正在开发共享库libshared.so

您有一个静态库libstatic.a,其中包含您需要的一些内部类和功能。您想将其链接到.so,如下所示:

g++ -o libshared.so -shared myObj.o -lstatic

你还有一个executable.sh将使用你的.so并在运行时动态打开它

dlopen("libshared.so", RTLD_NOW)

您知道此可执行文件与libstatic.a静态链接(但您不确定该库的版本与您的版本完全相同)。

所以问题是:

当您知道libshared.so中已使用相同的库时,将libstatic.aexecutable.sh静态链接是否安全无误?

1 个答案:

答案 0 :(得分:0)

您应该避免将静态库链接到共享库。

因为共享库应该有position independent code(否则,动态链接器必须执行过多的重定位,并且您失去了共享库的好处),但静态库通常没有PIC。

阅读Drepper's paper: How to write a shared library

使用

构建库
  g++ -Wall -O -fPIC mySrc.cc -c -o myObj.pic.o
  g++ -o libshared.so -shared myObj.pic.o -lotherlib