为什么静态库使用可重定位目标文件,而共享库使用源文件?

为什么静态库使用可重定位目标文件,而共享库使用源文件?

我读过一本介绍静态库和共享库的教科书。有两个源文件addvec.cmultvec.c,要创建它们的静态库,我们将使用 ar 工具,如下所示:

linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o

所以基本上它只是首先创建可重定位目标文件(.o),然后将 ar 工具与这些 .o 文件一起使用。

但如果我们想构建一个共享库 libvector.so 那么书中的命令是:

linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c

请注意,我们直接使用源文件 (.c) 作为参数,而不是可重定位目标文件。

那么为什么对于共享库来说,不需要产生可重定位目标文件而直接使用源文件,这与使用可重定位目标文件的静态链接相比不一致呢?

答案1

分别构建共享库的组件对象:

gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o

但请注意,所有编译和链接步骤必须使用相同的标志。我怀疑这是您教科书中使用的方法背后的主要原因。静态库不需要位置无关的代码,但共享库需要。共享库是使用源文件中的 PIC 构建的,而不是两次显式构建各个目标文件,或者在静态库上“浪费”PIC。

相关内容