精华内容
下载资源
问答
  • 装入时动态链接和运行时动态链接
    千次阅读
    2019-06-30 13:37:54

    运行时动态链接:将对某些模块的链接推迟到程序执行时才进行。在执行过程中当发现一个被调用模块尚未装入内存时,立即由操作系统去寻找该模块,并将其装入内存,将其链接到调用者模块上。

    优点:许多情况下,应用程序在运行时,每次要运行的模块可能是不相同的,但由于事先无法清楚的知道本次要运行哪些模块,所以只能将所有可能运行的模块全部装入内存,并在装入时连接在一起。但在运行时动态链接过程中,在执行过程中都未用到的目标模块都不会被调入内存和链接,这样不仅能加快程序的装入过程,而且可以大大节省内存空间。

    更多相关内容
  • 实现链接的方法有三种:静态链接装入时动态链接和运行时动态链接。 ①静态链接 图5.2.2示出了经编译后所得到的三个目标模块A、B、C,他们的长度分别为 L、M、N。在模块A中,有 一条语句CALL B,用于调用模块B。在...

    实现链接的方法有三种:静态链接、装入时动态链接和运行时动态链接。

    ①静态链接

    经编译后所得到的三个目标模块A、B、C,他们的长度分别为 L、M、N。在模块A中,有

    一条语句CALL B,用于调用模块B。在模块B中,有一条语句CALL C, 用于调用模块C。B和C都属于外部

    调用符号,在将这几个目标模块链接装配成一个装入模块时,需要解决以下两个问题:

    ●对相对地址进行修改

    通常由编译程序产生的所有目标模块,其起始地址都为0,每个模块中的地址都是相对于0的。在链接成

    一个装入程序后,模块B和C的起始地址不再是0,而是L和L+M,此时需修改B和C中的相对地址,即模块

    B中的所有相对地址加上L,模块C中的相对地址都加上L+M。

    ●变换外部调用符号

    即将每个模块中所用的外部调用符号,都变换为相对地址,如把B的起始地址变换为L;C的起始地址变

    换为L+M。这种先进行链接所形成的一个完整的装入模块,又称为可执行文件。

    通常都不要拆开它,要运行时可直接将它装入内存。这种事先进行链接,以后不再拆开的链接方式,称为

    静态链接方式。

    ②装入时动态链接(Load-Time Dynamic Linking)

    用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的.即在装入一个目标模块时,若

    发生一个外部模块调用,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要修改目标模

    块中的相对地址。装入时动态链接方式有以下优点:

    ●便与软件版本的修改和更新

     

    在采用装入时动态链接方式时,要修改或更新各个目标模块,是件非常容易的事,但对于经静态链接以

    装配在一起的装入模块,如果要修改或更新其中的某个目标模块时,则要求重新打开装入模块,这不仅

    是低效的,而且有时是不可能的。

    ●便于实现目标模块共享

    若采用装入时动态链接方式,OS能够将一个目标模块链接到几个应用模块,即实现多个应用程序对该模

    块的共享;然而,采用静态链接方式时每个应用模块都必须含有该目标模块的拷贝,否则无法实现共享。

    ③运行时动态链接(Run –Time Dynamic Linking)

    虽然前面所介绍的动态装入方式,可将一个装入模块装入到内存的任何地方,但装入模块的结构是静态

    的,它主要表现在两个方面:一是在进程的整个执行期间,装入模块不改变;再者是每次运行时的装

    入模块都是相同的。实际上,在许多情况下,每次要运行的模块可能是不相同的,但由于事先无法知道

    本次要运行哪些模块,故只能是将所有可能要运行到的模块,在装入时全部链接在一起,是每次执行时

    的装入模块是相同的。显然这是低效的。因为这样,在装入模块的运行过程中,往往会有某些目标模块

    根本就不运行。比较典型的例子是错误处理模块,如果程序在整个运行过程中,都不出现错误,便不会

    用到该模块。

    能有效的改变这种情况的链接方式,是最近几年流行起来的运行时动态链接方式。这种链接方式,可将

    某些目标模块的链接,推迟到执行时才进行。即在执行过程中,若发现一个被调用模块尚未装入内存时

    ,由OS去找到该模块,将它装入内存,并把它连接到调用者模块上。

    展开全文
  • 装入时动态链接是指:用户源程序编译后,得到一组目标模块,在装入内存,采用边装入,边链接的方式。即在装入一个目标模块,若发生一个外部模事件,将引起装入程序去找出相应的外部目标模块,并将他装入内存。 ...

    装入时动态链接是指:用户源程序编译后,得到一组目标模块,在装入内存时,采用边装入,边链接的方式。即在装入一个目标模块时,若发生一个外部模事件,将引起装入程序去找出相应的外部目标模块,并将他装入内存。

    优点主要分为两点:

    (1)便于修改和更新:对于静态链接,如果需要修改获更新某个目标模块,需要重新打开装入模块,这不仅仅是效率问题,而在很多时候甚至是不可能的。而采用动态链接方式,由于个目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易地事情。

    (2)便于实现对目标模块的共享:在静态链接中,每个模块必含有目标模块的拷贝,无法实现共享,但采用装入时链接的方式,很容易将一个目标模块链接到几个应用模块上。

    展开全文
  • 载入时动态链接 系统启动一个使用载入时动态链接的程序,使用连接程序放置的到文件的信息来定位进程所需要的DLL的名称。然后系统将在以下位置顺序搜寻DLL:应用程序载入目录当前目录系统目录。通过...

    载入时动态链接

     

      系统启动一个使用载入时动态链接的程序时,使用连接程序放置的到文件的信息来定位进程所需要的DLL的名称。然后系统将在以下位置顺序搜寻DLL:

    1. 应用程序载入目录
    2. 当前目录
    3. 系统目录。通过GetSystemDirectory 函数可以得到。
    4. 16位系统目录。没有函数可以获取该目录,但它是被搜索的。

      Windows Me/98/95: 目录不存在

       

    5. Windows目录。通过GetWindowsDirectory 即可得到。
    6. PATH环境变量中所列目录。

    Windows Server 2003, Windows XP SP1: HKLM/System/CurrentControlSet/Control/Session Manager/SafeDllSearchMode 默认值为1 (当前目录在系统及Windows目录后进行搜索)。

    Windows XP:  如果HKLM/System/CurrentControlSet/Control/Session Manager/SafeDllSearchMode 为1,当前目录在系统及Windows目录后搜索,但在PATH环境变量所列的目录前。默认值为0(当前目录在系统及Windows目录前进行搜索)。注意载入时该值会被缓存到每线程的基础部分。

      如果系统不能找到所需DLL,就会终止进程并显示一个对话框报告错误信息。否则系统把DLL映射到进程的虚地址空间并增加DLL引用计数。

      接着系统调用入口点函数,函数收到一个代码指出进程正在载入该DLL。如果入口点函数没有返回TRUE,系统将终止进程并报告错误。关于入口点函数的更多信息,请参见“动态链接库入口点函数”。

      最后,系统用导入DLL函数的启动地址修改函数地址表。

      DLL将在初始化期间映射到进程的虚地址空间,并仅在需要时载入到物理内存中。

     

    运行时动态链接

     

      当应用程序调用LoadLibrary 或 LoadLibraryEx 函数时,系统就会尝试按载入时动态链接搜寻次序(参见载入时动态链接)定位DLL。如果找到,系统就把DLL模块映射到进程的虚地址空间中,并增加引用计数。如果调用LoadLibrary或LoadLibraryEx 时指定的DLL其代码已经映射到调用进程的虚地址空间,函数就会仅返回DLL的句柄并增加DLL引用计数。注意:两个具有相同文件名及扩展名但不在同一目录的DLL被认为不是同一个DLL。

      系统在调用LoadLibrary或LoadLibraryEx的线程上下文中调用入口点函数。如果已经有进程通过调用LoadLibrary或LoadLibraryEx函数载入了DLL,且没有调用FreeLibrary,那么入口点函数就不会再次调用。

      如果系统找不到DLL,又或者入口点函数返回FALSE,LoadLibrary或LoadLibraryEx将返回NULL。如果LoadLibrary或LoadLibraryEx调用成功,将返回DLL模块的句柄。进程可以通过该句柄标识调用GetProcAddress、FreeLibrary或FreeLibraryAndExitThread函数的DLL。

      GetModuleHandle返回的句柄可以被GetProcAddress、FreeLibrary或FreeLibraryAndExitThread所使用。只有当DLL通过载入时链接或前次LoadLibrary、LoadLibraryEx调用已经映射到进程的地址空间时,GetModuleHandle才会成功。GetModuleHandle 不会增加模块的引用计数。GetModuleFileName 函数通过GetModuleHandle、LoadLibrary或LoadLibraryEx返回的句柄获取所关联的模块全路径。

      模块可以通过GetModuleHandle、LoadLibrary或LoadLibraryEx返回的句柄,然后调用GetProcAddress得到DLL中出口函数的地址。

      如果不再需要一个DLL模块的话,进程可以调用FreeLibrary或FreeLibraryAndExitThread(来释放)。这些函数将减少模块的引用计数,并且如果引用计数为0时,将从进程的虚地址空间取消该DLL的映射。

      使用运行时动态链接即使DLL不可用的话,进程也能继续运行,然后进程可以通过一个变更方法达到最终目的。例如,如果进程不能找到一个DLL,它可以尝试另外一个或者向用户提示错误。如果用户可以提供丢失的DLL的全路径,进程就可以不管是否在正常的搜索路径中而使用该路径信息。然而如果是载入时链接的话,系统就会终止。

      使用运行时动态链接时,如果DLL使用DllMain函数为进程的每个线程完成初始化就会产生问题,这是因为线程在LoadLibrary或LoadLibraryEx调用前入口点函数不被调用。关于如何处理该问题的示例,可参照“动态链接库的线程局部存储”。

    展开全文
  • 背景 c语言中存在静态库(.a)和动态库(.so)。 静态库实际上是一些目标...由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的生成的可执行文件会比较大,多个程序运行时占用内存空间比较大(每个...
  • 装入时动态链接是指:用户源程序编译后,得到一组目标模块,在装入内存,采用边装入,边链接的方式。即在装入一个目标模块,若发生一个外部模事件,将引起装入程序去找出相应的外部目标模块,并将他装入内存。 ...
  • 深入浅出静态链接和动态链接

    万次阅读 多人点赞 2018-05-06 09:24:48
    作为一名C/C++程序员,对于编译链接的过程要了然于胸。首先大概介绍一下,编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件;...
  • 今天小编就为大家分享一篇关于Linux程序运行时加载动态库失败的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 大家对于Hello World程序应该非常熟悉,随便使用哪一种语言,即使还不熟悉的语言,写出一个Hello World程序应该毫不费力,但是如果让大家详细的说明这个程序加载和链接的过程,以及后续的符号动态解析过程,可能还会...
  • 程序的装入和链接

    2019-08-26 08:35:01
    用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:(1) 编译; (2) 链接; (3) 装入。 程序的链接 ...2. 装入时动态链接(Load-time Dy...
  • 本文介绍了静态链接和动态链接
  • 静态链接动态链接的区别使用

    万次阅读 多人点赞 2018-11-27 13:34:59
     编程中用到链接的是.c文件库(库里一般都是些函数,变量),.c文件要想用库里的内容就得做链接。    1、静态链接    静态链接:譬如让书本白板上的笔记之间做静态链接,就是把白板上的笔记抄在书上书...
  • 动态链接这个过程却没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,生成的可执行文件中并没有要链接的内容,所以当你删除动态,可执行程序就不能运行动态链接生成的可执行文件要比静态链接...
  • 关注、星标公众号,直达精彩内容作者:hguisu一、地址概念程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序数据装入内存。如何将...
  • 运行时动态链接是在执行程序调用到模块内容再将动态库中的相应模块载入到内存。 这里有两个时间问题。一是载入时间,二是执行时间。 静态链接由于是在一开始就把所有模块都加载进入内存,所以如果模块很多的话...
  • 静态链接和动态链接是什么?

    千次阅读 2021-01-29 15:27:52
    程序的运行过程分为两个阶段,分别为编译阶段和链接阶段,而编译阶段又分为三部分:预编译,编译,汇编 预编译(生成.i文件) 展开头文件,宏替换,条件编译,去掉注释 编译(生成.s文件) 检查错误,...
  • 程序的链接和装入

    2021-11-16 19:43:14
    2.装入时动态链接装入内存,边装入链接 3.运行时动态装入 在程序的执行过程中,发现某个被调用模块未被装入内存,立即装入内存,并将其链接到调用模块上 二.程序的装入 1.绝对装入 绝对装入只适合于单道...
  • 用户程序要在系统中运行,必须要把它装入内存,然后再将其转变成一个可执行程序。 用户程序变为可执行程序都需要执行以下步骤: 编译:由编译程序进行编译,形成若干个目标模块。 (编译程序执行) ...
  • 静态链接库 前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量函数,对于引用的函数变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数变量进行解析,通常...
  • 其要点是:用户根据实际情况需要,利用 dlopen,dlsym,dlclose等动态链接库操作函数,装入指定的动态链接库中指定的函数,然后加以执行.程序中使用很少的动态函数,这样的 做法尚可.如果程序需要调用大量的动态函数,那么...
  • 30程序的装入和链接

    2021-01-18 09:28:46
    程序装入和链接 创建进程首先要将程序数据装入内存。将用户源程序变为可在内存中执行的程序,通常分为以下几个...1.2:装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存,采用边装入链接
  • 前言 本文梳理程序是如何运行的。 内存的基础知识 内存的概念作用 内存是用于存储数据的硬件。程序执行前需要先放到内存中才能被CPU处理。 ...内存地址从0开始,每个地址对应一个...在生成机器指令并不知道该进程
  • 程序的静态链接动态链接和装载

    千次阅读 2017-04-14 09:59:07
    转自:程序的静态链接动态链接和装载 参考自:http://www.xuebuyuan.com/1730287.html 一、程序编译链接的整体流程 二、目标文件的样子(以linux下的elf文件格式为例) 三、静态链接 四、装载 五、...
  • 这一篇也是在学习原理,学习了之前的一种存储器的抽象:地址空间。还有了解了链接和装入方式。其中对装入的方式还学习了哈工大老师的课程,讲的很不错,也更深入了解了装入方式。
  • 此时就需要链接程序来对这些目标模块进行链接,它会将这若干个目标模块它们调用的库函数链接在一起,然后形成一个整体的模块,然后才会被放入内存中从而被调用。 明白链接是什么操作后,我们给出链接的定义: 源...
  • 程序的链接和装入存在着多种方法,而如今最为流行的当属动态链接动态装入方法。本文首先回顾了链接和装入器的基本工作原理及 这一技术的发展历史,然后通过实际的例子剖析了Linux系统下动态链接的实现。了解底层...
  • os 程序的装入和链接

    2022-01-25 09:32:56
    os 程序的装入和链接
  • 静态链接动态链接原理

    千次阅读 2022-02-09 10:57:46
    示例程序 main.c: #include <stdio.h> void print_banner() ...源文件想变成能够在内存中运行的程序,需经历编译、链接、载入3个步骤。 编译: gcc -Wall -g -o main.o -c main.c -m32 链接: gcc -o
  • 往期地址: 操作系统系列一 —— 操作系统概述 操作系统系列二 —— 进程 操作系统系列三 —— 编译与链接关系 操作系统系列四 —— 栈与...静态链接的原理简单也比较容易实现,还需要使用动态链接的原因是静态链接
  • 70.调用动态链接库 2 - CLN 的配置选项.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,842
精华内容 17,536
关键字:

装入时动态链接和运行时动态链接

友情链接: Grayscale-color-image.rar