随想录(动态库的特点)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com


    实际工作中动态库和静态库都用到,今天聊一下两者的区别。如果没有特别的说明,这里的动态库是指linux系统下的动态库。同样,静态库也是指linux下的静态库。两者都是elf文件、都可以用gcc编译生成。


1、动态库会节省空间

动态库可以被很多程序共享,不用特别编译到执行文件里面。


2、动态库更新方便

软件如果更新幅度不大,可以只更新动态库即可。


3、动态库可以更好的开发插件

扫描二维码关注公众号,回复: 910435 查看本文章

很多软件、比如lighttpd服务器,都是用动态库来开发插件。


4、动态库也是可以执行的

比如ld.so就可以独立执行


5、动态库依赖于编译器、链接器和加载器的合作

动态库首先需要用-shared和 -fPIC进行编译,链接的时候需要生成.got、.got.plt,同样如果函数加载失败需要loader和kernel的配合。


6、动态库版本的更新依赖于soname机制

动态库有时候也需要更新,这个时候可以用soname来完成


7、动态库中的函数需要延迟加载

动态库里面的函数都要经过loader一下,才能被识别

比如说printf,第一次是找不到函数地址的,只有被__dl_runtime_resolove一下才能被识别


8、静态库和动态库一般编译的时候一起生成

因为静态库调试起来更加方便,比如libc就常常静态库、动态库一起生成


ps:

关于gcc详细的编译过程,可以参考gcc -v hello.c。我们看到的是gcc,实际上它是由cc1、as、collect三个部分组成的。


猜你喜欢

转载自blog.csdn.net/feixiaoxing/article/details/80142688