静态链接是在生成可执行程序的时候就把库中的内容加入到程序中。\r\n\r\n载入时动态链接是在将功能
模块读入内存时把动态库中调用到的相关模块的内容载入内存。\r\n运行时动态链接是在执行程序调用到模块内容时再将动态库中的相应模块载入到内存。\r\n\r\n这里有两个时间问题。一是载入时间,二是执行时间。\r\n
静态链接由于是在一开始就把所有模块都加载进入内存,所以如果模块很多的话效率就会被大大拉低。\r\n载入时动态链接是分别载入,当把一个模块载入内存时检查有调用关系的模块载入,比静态链接节省了许多开销。\r\n运行时动态链接则是把当前模块调用的模块推迟到调用的时候再载入。\r\n三者之间的关系就像是机q,冲锋q和手q\r\n机q在一开始就把所有子d装好,开q的时候很快,但也很笨重。\r\n冲锋q则是将子d分d夹存好,轻便了许多,但是会有一段装填时间。\r\n手q就更加轻便了,但是d夹容量更小,装填的频率又变高了。静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。 静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。 像Unix ld程序这样的静态链接器(static linker)以一组可重定位的目标文件作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在一个节中;而未初始化的变量在另外一个节中。 为了构造可执行文件,链接器必须完成两个主要的任务: 1、符号解析(symbol resolution)。目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。 2、重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义和一个存储器位置联系起来,然后,修改所有对这些符号的引用,似的他们指向这个存储器位置,从而重定位这些节。静态连接是指在编译时将某个模块的代码或者数据链接到另一个模块的代码或数据上的过程。它可以把多个模块的代码合并成一个单独的可执行文件。与动态连接不同,静态连接是在编译时实现的,而动态连接是在执行时实现的。
静态连接有时也称为链接,因为它把模块链接到一起,使它们能够一起工作。一般来说,静态连接有两个步骤:首先要把每个模块的代码编译成目标代码,然后将它们链接到一起,形成单个可执行文件。
静态连接的优点是,它可以把模块链接到一起,使它们可以作为一个整体运行,从而减少了内存的使用。此外,静态连接还有一个重要的优点,就是它可以保证程序的稳定性,因为在静态连接时,模块的代码都被链接到一起,在程序执行时,就不会出现模块更新的问题。
但是,静态连接也有缺点,比如,它的运行效率比动态连接要低,因为它需要先把模块的代码编译成目标代码,然后再链接,这需要很多的时间。此外,它也不太灵活,因为模块的代码在编译后就不能更改,这意味着如果想要更新模块的代码,就需要重新编译和链接。
评论列表(0条)