首页
学习
活动
专区
圈层
工具
发布

重定位 静态链接 动态链接 动态加载

动态链接与静态链接的区别 静态链接库、动态链接库、导入库的区别 Linux下的静态库、动态库和动态加载库 ---- 总结:并没有找到动态链接与动态加载的明显区别,但动态链接与静态链接的区别是明显的:...---- 静态重定位 重定位时,取重定位项,加上重定位因子得到欲修改位置的实际地址。 优点:无须硬件支持 缺点:程序重定位以后就不能在内存中移动。...动态重定位 当CPU取一条访问内存的指令时,地址变换硬件将指令中的相对地址与重定位寄存器中的值 相加,再根据和值去访问该单元的数据。...装配模块不加任何修改就装入内存 需要硬件(重定位寄存器)的支持 静态链接、动态链接 静态链接 动态链接(dll) 装入时链接 运行时链接 装入时链接: 用一个动态导入表保存需要使用的dll文件和dll...运行时链接: 用API函数LoadLibrary或LoadLibraryEx函数来装入动态库(共享引用计数增加1) 通过GetProcAddress函数来获得函数的地址,并且传递给函数相应的参数,调用这个函数

2.4K70

静态链接-空间与地址分配

当我们有两个目标文件时,如何将它链接起来成一个可执行文件?这个过程发生了什么?这基本上就是链接的核心内容:静态链接。...“链接器为目标文件分配地址和空间”这句话中的“地址和空间”其实有两个含义: 在输出的可执行文件中的空间; 装载后的虚拟地址中的虚拟地址空间。...这一步,链接器能够获得所有输入目标段长度,并且将它们合并,计算出输出文件中的各个段合并后的长度与位置,并建立映射关系; 符号解析与重定位 使用上面一步收集到的所有信息,读取输入段的数据、重定位信息,并且进行符号解析与重定位...事实上,第二步是链接的核心,特别是重定位的过程。...在第一步的扫描和空间分配阶段,链接器按照前面介绍的空间分配方法进行分配,这时候输入文件中的各个段在链接后虚拟地址就已经确定,比如“.text”段起始地址为0x08048094,“.data”段的起始地址位

2.6K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    页表、地址重定位、地址保护的名词解释

    页表、地址重定位、地址保护的名词解释 页表: 我的解答: 页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。...地址重定位: 我的解答: 地址重定位指把目标程序中的逻辑地址转换成主存空间的物理地址。 其计算方法为:物理地址(PA)= 块号×页长+页内地址。...老师的解答: 把用户空间的逻辑地址转换成实际主存空间的物理地址的过程。 地址保护: 我的解答: 保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。...实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。...这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问。 老师的解答: 对用户程序、操作系统等地址空间的管理,防止程序间的代码保护。

    61010

    静态链接,静态分派,动态链接

    静态链接: 编译时即可确认要转换成哪个直接引用。 编译的时候由于能够确定变量的静态类型,所以编译时可知,也就是为什么叫做静态链接的原因。...唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明...静态链接发生的阶段其实也可以分为:静态分派和解析阶段 解析阶段就是将编译期可以确定不会发生变化的符号引用转换为直接引用。...而且当找不到对应的静态类型的时候在还会默认对静态类型进行转换。 动态链接: 编译时不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。...所以叫做动态链接运行时才可以确定。

    2K30

    链接 动态链接 静态链接

    符号解析的目的是将每个符号引用和一个符号定义联系起来 重定位 编译器和汇编器生成从地址零开始的代码和数据节。...链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。 静态链接的输入文件是一系列的目标文件,输出是可执行的目标文件。...首先是可重定位目标文件的ELF文件:从上到下依次是: 可重定位目标文件的ELF文件 ELF头部 .text .rodata .data .bss .symtab rel.text rel.data .debug...这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。 动态链接有是怎么回事呢?...在了解之前,我们要知道静态库,刚才我们所说的都仅仅是将一系列的可重定位目标文件变成一个可执行目标文件,实际上,所有的编译系统都提供了一种机制,将所有的目标模块打包成一个单独的文件,称为静态库,他也可以作为静态链接器的输入

    4.3K30

    静态链接和动态链接

    ,例如宏、#inclue、预编译指令 #ifndef 等进行处理,生成的是 *.i 文件; 编译:主要进行词法分析、语法分析和语义分析,生成 *.s 汇编文件; 汇编:将汇编指令翻译为机器指令,生成可重定位二进制目标文件...三、静态链接 上面提到链接分为静态链接和动态链接,静态链接先于动态链接出现,动态链接属于计算机发展较后期出现的技术。两者没有优劣之分,只是各自有各自适用场景。...libxxx.o 会被加载到内存中,当 program2 执行时发现内存中已经存在 libxxx.o,则不再对其进行重新加载,而是将内存中已经存在的 libxxx.o 映射到 program2 的虚拟地址空间中...据估算,动态链接和静态链接相比,性能损失大约在5%以下。经过实践证明,这点性能损失用来换区程序在空间上的节省和程序构建和升级时的灵活性是值得的。 注:动态链接库地址生定位问题。...比如我们在形成可执行程序时,发现引用了一个外部的函数,此时会检查动态链接库,发现这个函数名是一个动态链接符号,此时可执行程序就不对这个符号进行重定位,而把这个过程留到装载时再进行。

    1.2K10

    【CSS】定位 ② ( 静态定位 | 相对定位 )

    一、静态定位 ---- CSS 中的 静态定位 是 默认的定位方式 , 就是无定位 , 设置该定位方式 , 定位盒子不生效 ; 为盒子模型 设置 静态定位 模式 , 该 盒子模型 就会按照标准流的方式...摆放布局 , 没有任何 边偏移 的效果 ; 在 使用 定位 时 , 几乎不适用 静态定位 ; 二、相对定位 ---- 相对定位 是 盒子模型 相对于 其在 标准流中的位置 设置的 ; 如 : 盒子模型...在标准流 中 , 原来的位置是 (0 , 0) , 设置了相对定位 , 就是 相对于原来的位置 (0, 0) 进行 边偏移 后的位置 ; 下面的示例中 , 盒子模型的初始位置是 在浏览器的 左上角 (...DOCTYPE html> 相对定位 div {...= 定位模式 + 边偏移 */ /* 定位模式 : 相对定位; */ position: relative; /* 顶部偏移量 100 像素 */ top: 100px;

    2.5K20

    什么是重定位?为什么需要重定位?

    ②位置无关码,就是这句代码在哪里运行都可以的,跟所处的地址无关,跟位置有关码相反。 二、重定位需要理解的一些问题。 1、链接地址跟运行地址不同的情况下会出现什么情况?...所以这时候就需要初始化DDR才可,而因为我们知道这代码将来都是在DDR上面运行的,所以链接脚本指定的链接地址肯定是DDR上面的地址,所以这就出现了链接地址跟运行地址不同的情况了。 3、什么是重定位?...答:由于出现1这样的问题,就需要使用重定位这种方式解决上面的问题了。那什么是重定位呢?...重定位就是在链接地址跟运行地址不同的情况下,执行一段位置无关码,这段位置无关码的作用就是将原来的那份代码全部复制到链接地址那里去,然后自己再长跳转到新的那份代码的刚刚执行的那个位置。...这样就实现了链接地址跟运行地址一致的情况了。 4、为什么需要重定位? 答:就是链接地址跟运行地址不同,在这个情况下我们可以有两种方案: ①全部使用位置无关码。 ②进行重定位让这两个地址相同。

    2.6K10

    【图片+代码】:GCC 链接过程中的【重定位】过程分析

    在链接的过程中,符号重定位是比较麻烦的事情,特别是在动态链接的过程中,因为需要考虑到很多不同的情况。 这篇文章作为第一篇,先来聊一聊静态链接中的重定位过程。...链接器在重定位的时候,目的就是计算出相对地址,然后替换掉fc ff ff ff这四个字节。...重定位表信息 指令:objdump -r main.o 重定位表就表示: 该目标文件中,有哪些符号需要在链接的时候进行地址重定位。...绝对地址重定位 然后,链接器第二遍扫描所有的目标文件,检查哪些目标文件中的符号需要进行重定位。 对于我们的示例程序,首先来看一下main.o中使用的外部变量SubData的重定位。...以上就是静态链接过程中地址重定位的基本过程,与动态链接相比,静态链接还是相对简单很多。 以后有机会的话,我们再继续聊一下动态链接中的一些操作,谢谢!

    1.3K10

    【图片+代码】:Linux 动态链接过程中的【重定位】底层原理

    在上一篇文章中,我们一起学习了Linux系统中 GCC编译器在编译可执行程序时,静态链接过程中是如何进行符号重定位的。 为了完整性,我们这篇文章来一起探索一下:动态链接过程中是如何进行符号重定位的。...详细的静态链接过程,请参考上一篇文章:【图片+代码】:GCC 链接过程中的【重定位】过程分析。 也就是说:符号重定位的过程,是直接对可执行文件进行修改。...只有当所有需要被重定位的符号被解决了之后,才能开始执行程序。 既然也是重定位,与静态链接过程一样:也需要把符号的目标地址填写到代码段中需要重定位的地方。 矛盾:代码段不可写 问题来了!...然后在第二遍扫描的时候,查看每个目标文件中需要重定位的符号,然后在全局符号表中查找该符号被安排在什么地址,然后把这个地址填写到引用的地方,这就是静态链接时的重定位。...但是动态链接过程中的重定位,与静态链接的处理方式差别就大很多了,因为每个符号的地址只有在运行的时候才能知道它们的地址。

    3.6K23

    9_重定位

    重定位结束后,CPU会从这个地址读取第一条指令开始执行程序。 9.3.2 汇编重定位data段 ​ 下面我们将通过一个实例来说明为什么要重定位data段以及如何通过汇编重定位data段。 ​...所以我们将.data段重定位后的地址设置为0x900000。 9.3.2.4 步骤2:修改链接脚本 ​ 创建一个变量用来存储.data段的起始加载地址。....data 0x900000 : AT(data_load_addr) ​ 下面我们将重定位后.data段的起始地址存储在变量data_start,重定位后的.data段的结束地址存储在变量data_end...段重定位地址, 0x900000 */ ldr r2, =data_end /* data段结束地址(重定位后地址 0x90....) */ sub r2, r2, r1 /...,需要使用绝对跳转命令ldr pc, = xxx,跳转到重定位后的地址。 ​

    1.5K10

    C++静态链接

    可以想象一个有几百个编译单元的工程同时实例化了许多个模板,最后链接的时候必须将这些重复的代码消除掉,否则最终程序的大小肯定会膨胀得很厉害。 地址较易出错。有可能两个指向同一个函数的指针会不相等。...那么这种情况下链接器可能会做出一个选择,那就是随意选择其中任何一个副本作为链接的输入,然后同时提供一个警告信息。...当我们须要用到某个目标文件中的任意一个函数或变量时,就须要把它整个地链接进来,也就是说那些没有用到的函数也被一起链接了进来。...但是这个优化选项会减慢编译和链接过程,因为链接器须要计算各个函数之间的依赖关系,并且所有函数都保持到独立的段中,目标函数的段的数量大大增加,重定位过程也会因为段的数日的增加而变得复杂,目标文件随着段数目的增加也会变得相对较大...以上的情况对于系统中已经存在的静态库或动态库须要被多个应用程序使用的情况也几乎相同,或者一个程序由多个公司或多个部门起开发,也有类似的问题。

    2.4K10

    静态链接库

    库文件用于程序的链接阶段,但编译器提供有 2 种实现链接的方式,分别是静态链接方式和动态链接方式,其中采用静态链接方式实现链接操作的库文件,称为静态链接库;采用动态链接方式实现链接操作的库文件,称为动态链接库...本文将介绍静态链接库。 静态链接库简介 静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。...需要遵循规则libxxx.a 静态链接库使用 下面使用该静态链接库,在main.c文件中包含helloworld_c.h文件,即可使用Print_HelloWorld()函数。...直接在GCC参数里加上-static和相应的静态链接库即可。...-L(大写的 L)选项用于向 GCC 编译器指明静态链接库的存储位置; -l(小写的 L)选项用于指明所需静态链接库的名称,注意这里的名称指的是 xxx 部分,且建议将 -l 和 xxx 直接连用(即

    2.6K20

    IP 地址怎么定位?

    我们经常可以在影视作品中见到某某组织通过对某个人的 IP 地址进行监控,定位其位置,甚至精确到某栋大楼的某一层,如此可怕的场景在现实生活中真的有可能会发生吗?...先来说结果,仅通过 IP 地址最精确能够达到街道级别。而且在不通过运营商的用户数据库查询情况下,定位到家庭住址和单元楼的情况难度很高。...ISP 在《互联网是如何工作的》[1]一文中,我们介绍道,IP 地址是类似于现实世界中的地址这样的东西,通过 IP 地址,我们就可以在网络上定位到一台计算机,在现实世界中,IP 地址是由一个叫互联网服务提供商...精确定位 通过上一小节的讲解我们知道了可以通过申请的运营商的地址判断你的 大致位置 ,这个大致位置可以精确到省市,如图 2 所示,我们在百度搜索 IP,就可以给我们返回本机 IP 所在的城市。 ?...扩展 延伸一下,获取到精确的定位我们可以做些什么?

    6.1K20

    深入理解动态链接和静态链接

    1.如何理解静态链接下面的这个是老师的板书里面的内容:1)hello.o 文件是 hello.c 文件编译之后得到的,里面的这个 code.o 也是一样的道理2)两者进行链接之后形成了我们的可执行文件...我们可以发现这个 header 里面的内容,实际上表示的是我们的这个 ELF 文件里面的每一个部分的相关的属性,比如这个大小之类的,都是使用字节作为属性的大小单位的;因此,我们为什么说这个.o 文件是地址重定位的文件...,因为不同的 o 文件进行合并的时候都会修正这个函数的地址为真实存在的地址,而不是 o 文件没有进行链接的时候的无法识别的地址;2.关于动态链接在这个部分以及后续的文章里面我会使用新的形式去写博客,就是这个...,对于这个动态链接里面的相关的内容进行介绍和讲解;ELF 格式的文件的几个组成的部分:下面是播客里的关于:结头表和程序头表的介绍,链接的时候需要使用 section header table;至于他们在...:关于动态链接,地址无关性的理解:PS:上面就是播客,两人对话的音频,感兴趣的可以私信我获取,我可以分享给大家;我觉得使用这样的形式对于 linux 进行学习会轻松一些,因为有些一些理论对于初学者还是有难度的最后放一张图

    28910

    符号解析与重定位

    1.重定位 在完成空间与地址的分配步骤之后,链接器就进入了符号解析与重定位的步骤,这也就是静态链接的核心作用; 在分析符号解析和重定位之前,首先让我们来看看“a.o”里面是怎么使用这两个外部符号,也就是说我们在...我们通过前面的空间和 地址分配可以得知,链接器在完成地址和空间分配之后就已经确定了所有符号的虚拟地址了,那么链接器就可以根据符号的地址对每个须要重定位的指令进行地位修正。...我们可以使用 objdump来查看目标文件的重定位表。 这个命令可以用来查看“ao”里面要重定位的地方,即“a.o”所有引用到外部符号的地址。...重定位的过程中,每个重定位的入口都是对一个符号的引用,那么当链接器须要对某个符号的引用进行重定位时,它就要确定这个符号的目标地址。...这时候链接器就会去查找由所有输入目标文件的符号表组成的全局符号表,找到相应的符号后进行重定位。

    2K11

    Linux动静态库以及动静态链接

    ⽂件 • v:verbose 详细信息 静态库的使用 程序中使用到库的内容时,需要将库进行链接。...使用选项-L -I -l指明条件,来使用静态库。头文件在预处理阶段就需要。 也可以在/lib64/下,与别人的库进行软链接。库文件拷贝到/lib64/下。...再执行ldconfig命令 静态链接(Static Linking) 1. 原理 静态链接在**编译阶段**将所有依赖的库代码复制到最终的可执行文件中。...使用的库文件:.a(静态库) 链接器:ld(由gcc调用) 2....特性 静态链接 动态链接 链接时机 编译时 运行时 可执行文件大小 大(库代码被复制) 小(仅记录依赖) 内存使用 每个进程独立加载库 多进程共享一份库 库更新 需重新编译程序 替换.so即可(接口兼容

    32110

    操作系统页式地址重定位模拟算法实现(C语言版)

    目录 一、基本地址变换机构 二、地址变换过程 三、实验内容 四、代码实现 五、运行结果 ---- 一、基本地址变换机构 ?...4)将逻辑地址中的页内地址送入物理地址寄存器的块内地址字段,拼接,得到最后的物理地址:块号×块长度+W 三、实验内容 当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移...1、 设计页表结构 2、 设计地址重定位算法 3、 有良好的人机对话界面 四、代码实现 #include #include #include...n"); printf("\t|| ||\n"); printf("\t|| 欢迎使用页式地址重定位模拟系统...); printf("\t|| 请选择: ||\n"); printf("\t|| 1:重定位

    3.2K30

    【Linux】动静态库以及动静态链接

    动静态库与动静态链接 在Linux下共分为两种库,一种是动态库,另一种为静态库。其实我们可以通过后缀就可以区分该库是否为动态库。...理性理解 动态库专门让编译器对用户的程序进行动态链接,在动态链接时,只需要拷贝动态库中所需要的函数代码地址到自己的可执行程序中对性的相关位置即可。...优点 因为动态库是被共享的,具体的实现方式都是在库中,我们的程序中只有地址,会很大的节省空间。...静态库与静态链接 感性理解 感性理解就是将网吧里我们最喜欢的那台电脑给买回来,放在宿舍里供自己玩耍。...理性理解 静态库专门让编译器对用户的程序进行静态链接,在链接时,将静态库中所需要的完整代码给拷贝到自己的可执行程序内部中。

    5.8K50
    领券