关于动态链接与静态链接

大家都知道应用程序有两种链接方式,一种是静态链接,一种是动态链接,这两种链接方式各有好处。

程序的静态连接还是动态连接是根据编译器的连接参数指定的。

所谓静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。(所谓库就是一些功能代码经过编译连接后的可执行形式。)

所谓动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。


上面的都是一些概念性的,也是比较简单的,可能大家都知道,但是具体的实现方式是什么样的那?比如两个最主流的操作系统windows和linux是怎么实现的。

windows:

在windows上大家都是DLL是动态链接库,里面是一系列可执行的代码,开发过windows程序的人可能还知道有另外一种形式的库,就是LIB,大家可能普遍认为LIB就是静态库,至少我之前是这么认为的,但是在实际的开发过程中,纠正了我这个错误的想法。LIB形式的文件可能会有两种形式,这里并不排除第三种形式。1:包括符号表和二进制可执行代码,也就是传统意义上理解的静态库,可以被静态连接。2:只有符号表,也就是只有动态库的符号导出信息,通过这些信息可以在程序运行时定位到动态库中,最终实现动态连接。

linux:

在linux上大家也都知道SO是动态库,类似于windows下的DLL,实现方式也是大同小异,同时开发过linux下程序的人也都知道另外一种形式的库就是A库,同样道理普遍认为是和SO对立的,也就是静态库,不然没道理存在啊,呵呵。但是事实区却不是如此,A文件的作用和windows下的LIB文件作用几乎一样,也可能会有两种形式,和windows下的lib文件一样,在此就不在赘述。


对于两个平台下我认为是静态库的竟然还有第二种情况(就是LIB和A不只是静态库)是我万万没有想到的,对此我感到非常诧异,可能大家都意识到了(只有我没意识到),再此对自己批评一番!


经过这样一说可能大家都会明白了(也许你已经明白),在以后的开发中可能也都会用心一点,其实很多东西都不是我们表面上看来的那么简单,上面的理解和解释不一定全对,但是确实我在实际开发中所发现的,大家仅仅作为参考就行。在此我也告诫自己,凡事不能想当然,不能以自己所知道和理解的那一点做为正确答案,要善于学习,善于向比自己强的人学习,要勇敢的面对自己的错误!



上一篇:LINUX系统工程师技术(Engineer)-------第二天


下一篇:Linux运维工程师面试-部分题库(免费分享)