我想确切知道在动态库的情况下链接过程是如何工作的。我已经知道它首先在内存中加载图像/二进制文件(对于每个调用/链接库的程序),它被调用。但我的问题如下:程序如何区分共享库和静态库?只是通过.so和.a?如果我链接动态库的完整路径,如/path/to/so/file.so它听起来很傻,但它是否变为静态,内容被复制到可执行二进制文件?
谢谢...
答案 0 :(得分:1)
不,为链接器提供完整路径并不会将库转换为静态库。 "决定"哪些代码将成为二进制文件的一部分,在编译时发生。加载二进制文件时,加载程序可以加载其他库(动态),但它们不是二进制文件本身的一部分(即编译完成后二进制文件的大小不会改变)。
加载程序可以通过检查库的目标文件来区分静态库和动态库。此文件在编译过程中生成(例如,使用" -shared"在Linux gcc上),即编译的静态库具有与动态编译的库不同的目标文件格式。
提供链接器的完整路径与链接器搜索库文件以进行编译的方式有关(或者稍后在加载器上查找系统上的共享库时)。它不会影响库的类型(已经"选择"编译时)。