首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

链接 动态链接 静态链接

要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事: 符号解析 目标文件定义和引用符号...链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。 静态链接的输入文件是一系列的目标文件,输出是可执行的目标文件。...,每一个节经过链接会变成段,段对应的是执行相关的,而且段对应的是可执行目标文件的ELF文件,现在就来看看经过静态链接生成的可执行目标文件的ELF文件格式,这里面都是以段作为术语的: 可执行目标文件的ELF...这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。 动态链接有是怎么回事呢?...,这个过程就叫做动态链接

2.9K30

动态链接

动态库的基本实现 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有的程序模块都链接成一个个单独的可执行文件。...动态链接涉及运行时的链接及多个文件的装载,必需要有操作系统的支持,因为动态链接的情况下,进程的虚拟地址空间的分布会比静态链接情况下更为复杂,还有一些存储管理、内存共享、进程线程等机制在动态链接下也会有一些微妙的变化...当程序被装载的时候,系统的动态链接器会将程序所需要的所有动态链接库(最基本的就是libc.so)装载到进程的地址空间,并且将程序中所有未决议的符号绑定到相应的动态链接库中,并进行重定位工作。...程序与libc.so之间真正的链接工作是由动态链接器完成的,而不是由我们前面看到过的静态链接器ld完成的。也就是说,动态链接是把链接这个过程从本来的程序装载前被推迟到了装载的时候。...的确,动态链接会导致程序在性能的一些损失,但是对动态链接链接过程可以进行优化,比如我们后面要介绍的延迟绑定( Lazy Binding)等方法,可以使得动态链接的性能损失尽可能地减小。

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

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

    动态链接与静态链接的区别 静态链接库、动态链接库、导入库的区别 Linux下的静态库、动态库和动态加载库 ---- 总结:并没有找到动态链接动态加载的明显区别,但动态链接与静态链接的区别是明显的:...一个是编译时就链接进可执行文件,一个是执行时才链接。...装配模块不加任何修改就装入内存 需要硬件(重定位寄存器)的支持 静态链接动态链接 静态链接 动态链接(dll) 装入时链接 运行时链接 装入时链接: 用一个动态导入表保存需要使用的dll文件和dll...装入时检根据动态导入表依次装入每个动态库。...运行时链接: 用API函数LoadLibrary或LoadLibraryEx函数来装入动态库(共享引用计数增加1) 通过GetProcAddress函数来获得函数的地址,并且传递给函数相应的参数,调用这个函数

    1.6K70

    Linux动态链接

    动态链接 动态链接库,在Linux下是.so文件,在编译链接时只需要记录需要链接的号,运行程序时才会进行真正的“链接”,所以称为“动态链接”。...命名规则 动态链接库与应用程序之间的真正链接是在应用程序运行时,因此很容易出现开发环境和运行环境的动态链接库不兼容或缺失的情况。 Linux通过规定动态链接库的版本命名规则来管理兼容性问题。...libstdc++.so.6.0.21:real name,这是动态链接库的真正名称。 相关路径 /lib:最关键和基础的动态链接库。 /usr/lib:关键的动态链接库。...ldconfig 动态链接器不可能在每次查找动态链接库都去遍历所有动态链接库的目录,这样速度太慢了。...因此,在系统启动时会通过ldconfig为动态链接库生成SO_NAME和/etc/ld.so.cache存放系统动态链接库的路径信息,加速动态链接库的查找。

    5K91

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

    唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明...(静态分派和动态分派的区别在于:静态分派是根据静态类型来确定调用的方法是哪个,而动态分配时根据变量的实际类型。...动态链接: 编译时不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。...动态链接是和变量的实际类型相关的,因为变量的实际类型不能够在编译时确定只能等到运行时才可以,比如某个条件成立就将这个变量转换为A,不成立转为B(前提这个条件的成立与否必须是运行时才可以确定的,不能够在编译时就能够确认比如...所以叫做动态链接运行时才可以确定。

    1.3K30

    CC++|链接|动态链接

    我们经常在游戏目录下看见dll文件,这是windows下的动态链接库。在linux下我们可以使用-shared -fpic生成so文件。...动态链接的好处在于,当我们需要变更函数实现时,不需要重新编译整个可运行文件,只需要修改动态链接库即可,所以破解游戏的时候通常补丁就是一个dll而已。快忘光了,写个随笔复习一下,大一知识简单勿怪。...PLT索引 = 函数索引x+1 GOT索引 = 函数索引x+3 初次调用,惰性加载 调用PLT[x+1] 跳转*GOT[x+3](桩代码地址) 传递动态链接函数索引x 跳转PLT[0] 传递动态链接表地址...GOT[1] 跳转*GOT[2](动态链接器函数地址) 修改GOT[x+3]为动态函数地址 后续调用,直接跳转 调用PLT[x+1] 跳转*GOT[x+3](动态函数地址) 应用 #include...RTLD_DEEPBIND优先查找动态链接库的符号而非全局符号 RTLD_NOLOAD 不加载动态链接库,可用于修改之前的flag RTLD_NODELETE close时不会卸载,因此静态变量在reopen

    60020

    动态链接的相关结构

    在了解了共享对象的绝对地址的引用问题后,我们基本上对动态链接的原理有了初步的了解,接下来的问题是整个动态链接具体的实现过程了。动态链接在不同的系统上有不同的实现方式。...ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE在Windows下的动态链接过程和它们的区别 但是在动态链接情况下,...操作系统在加载完动态链接器之后,就将控制权交给动态链接器的入口地址(与可执行文件一样,共享对象也有入口地址)。...当所有动态链接工作完成以后,动态链接器会将控制权转交到可执行文件的入口地址,程序开始正式执行 1. ".interp"段 那么系统中哪个才是动态链接器呢,它的位置由谁决定?...要了解动态链接器如何完成链接过程,跟前面一样,从了解ELF文件中跟动态链接相关的结构入手将会是一个很好的途径。

    1.7K20

    GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件

    我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go...shared std 创建yxpkg包的 so库: root@docker ~/go# go install -buildmode=shared -linkshared yxpkg 编译 main.go 生成动态链接的可执行文件...: root@docker ~/g/src# go build -linkshared yaoxu.go 我们对比之前生成的静态链接的可执行文件:发现其可执行文件大小,相差很大; root@docker...可见,两个文件一个是动态链接文件,一个是静态链接文件。 其中需要注意的是,go进行动态链接编译的时候,还是需要源代码文件辅助编译,我想主要是构建符号表的原因。

    3.6K20

    C++动态链接

    动态链接动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。...动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。...break;   }    return TRUE;   } 当入口点函数返回 FALSE 值时,如果您使用的是加载时动态链接,则应用程序不启动。...如果您使用的是运行时动态链接,则只有个别 DLL 不会加载。   入口点函数只应执行简单的初始化任务,不应调用任何其他 DLL 加载函数或终止函数。

    2.5K50

    gcc用法以及静态动态链接

    -I:指定include包含文件的搜索目录 -o:输出成指定文件名,如果缺省则输出位a.out -L:搜索库的路径 -l:指定程序要链接的库 -w:忽略所有警告 -shared:指定生成动态链接库...放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:...由于共享函数库没有被整合进你的程序,而是在程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库. 共享函数库的改变并不影响你的程序,所以共享函数库的升级比较方便....而main_s是我们静态链接生成的,main_d是动态链接。我们分别运行后: [root@localhost gcc]# ....即可 找不到动态库 .

    1.5K20

    12、动态链接库,dll

    动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。...1、我们可以把完成某种功能的函数放在一个动态链接库中,提供给其它函数调用。...动态库: 动态库一般提供两个文件:一个引入库(.lib),一个是DLL(.dll)文件。.lib文件中包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。...在使用动态库情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中...可以通过定义一个模块定义文件.def的方式来解决这个问题: 新建一个newname.def文件,加入工程中: LIBRARY Dll2 EXPORTS add subtract Dll2 与生成的动态链接库名相同

    81520

    Delphi调用动态链接

    前言 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。...动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。...调用动态库的两种方法 静态调用 这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中...代码演示 我们先创建一个动态链接库名称为PosPayIntf,最近几章介绍Delphi技术的都是用这个动态库,因为正好因为项目要做一个对接第三方微信支付宝的动态库。 ?...---- 动态调用 今天我们主要说的还是动态调用,因为用动态调用的方法如果DLL不存在,或是入口函数有问题,我们都可以通过try except进行捕获,也不会影响主程序的使用。

    2.6K20

    webpack DLL 动态链接

    许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 DLL 文件,放置于系统中。当我们执行某一个程序时,相应的 DLL 文件就会被调用。...— 百度百科 翻译一下,在 webpack 中的动态链接库就是:由于每次更改了内容 webpack 都会自动重新编译打包,如果我们把用到的如 react、jquery 这些外部库抽离出去,改变文件的时候不让...再翻译一下,所谓动态链接库就是帮你提升开发效率的,使 webpack 在重编译的时候能打包更快。...我们以 react 这个库为例,假设我们要把 react 做为动态链接库,让其不需要每次重新编译。...react-dom'; ReactDOM.render(hello world, document.getElementById('app')); 打包 React 我们要把 react 做为动态链接

    2.2K10
    领券