【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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三个部分组成的。