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

Linux动态链接

动态链接 动态链接库,在Linux下是.so文件,在编译链接时只需要记录需要链接的号,运行程序时才会进行真正的“链接”,所以称为“动态链接”。...命名规则 动态链接库与应用程序之间的真正链接是在应用程序运行时,因此很容易出现开发环境和运行环境的动态链接库不兼容或缺失的情况。 Linux通过规定动态链接库的版本命名规则来管理兼容性问题。...如果存在多个同名(上面命名规则的name)动态链接库,linker name会指向最新的一个。 libstdc++.so.6:SO_NAME, 程序运行时会按照这个名称去找真正的库文件。...) linux-vdso.so.1是内核提供的一个动态链接库,所以这里只有一个内存地址。.../lib64/ld-linux-x86-64.so.2是一个动态链接库的绝对路径。

5K91
您找到你想要的搜索结果了吗?
是的
没有找到

链接 动态链接 静态链接

要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事: 符号解析 目标文件定义和引用符号...这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。 动态链接有是怎么回事呢?...像一些glibc提供的函数,我们可能随时随处都会用上,如果我们每次把函数的代码复制到每个进程的文本段,这无疑是一种浪费资源,所以出来了共享库的概念,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序链接起来...,这个过程就叫做动态链接。...共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。 其实.symtab这个存放符号的地方也是值得研究的,有机会再记录。

2.8K30

Linux动态链接库的使用

动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。...例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。...readelf -a smu.o 将二进制文件转换为汇编 objdump -d sum.o 动态链接库的生成 sum.c #include #include <stdlib.h...ELF 64-bit LSB executable file sum.o // ELF 64-bit LSB relocatable 因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库...,需要在.o文件生成时加参数-fPIC gcc -c sum.c -fPIC -o sum.o gcc sum.o -o shared sum.so 一般,共享库的编译命令为(曾经的实验) 动态链接

4.7K10

浅谈Linux动态链接

经过链接之后,那些第三方库定义的函数就能被调用执行了。早期的一些操作系统一般使用静态链接的方式,现在基本上都在使用动态链接的方式。...而动态链接链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库的某些函数时,再从这些第三方库读取自己所需的方法。...地址无关 无论何种操作系统上,使用动态链接生成的目标文件凡是涉及第三方库的函数调用都是地址无关的。...动态链接的优缺点 相比之下,动态链接主要有以下好处: 多个可执行文件可以共享使用系统的共享库。每个可执行文件都更小,占用的磁盘空间也相对比较小。...动态链接库查找过程 刚才提到,Linux动态链接库绝大多数都在/lib和/usr/lib下,操作系统也会默认去这两个路径下搜索动态链接库。

8.6K30

动态链接

目前主流的操作系统几乎都支持动态链接这种方式,在 Linux系统,ELF动态链接文件被称为动态共享对象(DSO, Dynamic Shared objects),简称共享对象,它们一般都是以“so”为扩展名的一些文件...; 而在 Windows系统,动态链接文件被称为动态链接库( Dynamical Linking Library),它们通常就是我们平时很常见的以“dll”为扩展名的文件。...在 Linux,常用的C语言库的运行库glib,它的动态链接形式的版本保存在“/lib”目录下,文件名叫做“ libc.so”。...当程序被装载的时候,系统的动态链接器会将程序所需要的所有动态链接库(最基本的就是libc.so)装载到进程的地址空间,并且将程序中所有未决议的符号绑定到相应的动态链接,并进行重定位工作。...ProgramI除了使用Lb.so以外,它还用到了动态链接形式的C语言运行库libc-2.61so。另外还有一个很值得关注的共享对象就是ld-2.6so,它实际上是 Linux下的动态链接器。

1.3K20

Linux链接文件_软链接和硬链接

一、链接文件介绍 Linux操作系统的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode的信息到块领域将数据取出来。...二、两者的区别 硬链接记录的是目标的inode,软链接记录的是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区链接。...在上例,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接的另外一个限制——不允许目录做硬链接。例: ?...上例,如果删除源文件,则不能读取软链接文件,而且使用命令ll查看时发现颜色也有变化。 说明目录不可以做硬链接,但可以做软链接,例: ?

6.5K30

Linux链接文件_软链接和硬链接

一、链接文件介绍 Linux操作系统的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode的信息到块领域将数据取出来。...二、两者的区别 硬链接记录的是目标的inode,软链接记录的是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区链接。...在上例,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接的另外一个限制——不允许目录做硬链接。例: ?...上例,如果删除源文件,则不能读取软链接文件,而且使用命令ll查看时发现颜色也有变化。 说明目录不可以做硬链接,但可以做软链接,例: ?

6.8K30

Linux的硬链接与软链接

inode号,它们的名字不一定相同,但只要inode号一样就行,它们最终都链接到一个文件里,这就是硬链接。...也就是说,当文件的硬链接数被目录记录了一次,文件的硬链接数就增加了一次。所以,文件只要在目录里存在,它就至少有一个硬链接。...硬链接     ln 源  新文件        一旦创建成功,则没有源和目的文件关系 (硬链接里面不分主次关系)一个文件,只有硬链接为0时才是彻底删除。 ​...(因为引入了对目录的硬连接就有可能在目录引入循环,在目录遍历的时候系统就会陷入无限循环当中,这样导致无法定位到访问目录)     目录的硬链接数包含目录自身的名字,以及.和子目录里的.. 791422...软连接: 软链接又称之为符号连接。软链接文件类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

4.2K10

Linux链接 ln

本文目录 1 i节点 2 硬链接 3 软链接 i节点 在Linux创建文件时,Linux会做两件事情,第一是在设备上保留一块空间存储数据,第二是创建一个i节点(i-node)存放该文件的基本信息。...05-12 10:37:53.792094043 +0800 Change: 2018-06-05 16:48:35.487772167 +0800 Birth: - 文件系统将i节点存放在一个大表,...硬链接 可以使用ln命令创建一个硬链接(或者叫链接),它的特点是会有多个目录项指向同一个i节点。从用户的角度来看,用户的文件具有多个文件名,这些文件名都指向同一个文件。...通过下面的命令创建新链接: ln TARGET LINK_NAME 其中TARGET是一个已经存在的普通文件,而LINK_NAME是新链接的名称。...软链接链接也叫做符号链接,这种链接的特点是会新建一个全新的文件,在该文件记录目标文件的路径。

2.7K10

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

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

1.6K70

详解 Linux 的硬链接与软链接

Linux 链接文件类似于 Windows 的快捷方式,Linux 链接文件分为硬链接和软链接,不过在具体介绍 Linux 的硬链接和软链接之前,先来看看 Linux 文件系统中文件的具体结构。...在 Linux 文件系统,一个文件被分成两个部分:元数据(metadata)与用户数据(user data)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。...Linux 文件系统为每一个保存在磁盘分区的文件(无论什么类型)都分配一个索引节点号(Inode Number),索引节点号是文件在一个文件系统的唯一标识,不同文件所对应的索引节点号是不相同的;」...硬链接相当于为文件创建了一个新的文件名,当删除其中一个链接的时候并不影响索引节点本身以及其它链接到该索引节点的文件名,所以这些链接是相对独立的,这也是为什么 Linux 仅仅标识文件硬链接的数目,并没有显示的标识文件是否为硬链接文件的原因...,在软链接删除源文件会影响到软链接的使用,因此在 Linux 中会有很多地方标识文件是否为软链接: ls -l指令输出的文件,其中十个字符的第一个字符代表文件类型,如果文件为软链接文件则为l; Linux

12.4K51

Linux 链接和硬链接的区别

什么是软链接 符号链接(Symbolic Link)(symlink),又称 软链接(Soft Link),是一种特殊的文件,它指向 Linux 系统上的另一个文件或目录。...这和 Windows 系统的快捷方式有点类似,链接文件记录的只是原始文件的路径,并不记录原始文件的内容。...符号链接通常用于对库文件进行链接,也常用于链接日志文件和 网络文件系统(Network File System)(NFS)上共享的目录。 什么是硬链接链接是原始文件的一个镜像副本。...创建硬链接后,如果把原始文件删除,链接文件也不会受到影响,因为此时原始文件和链接文件互为镜像副本。 为什么要创建链接文件而不直接复制文件呢?...而使用硬链接时,各个镜像副本的文件内容都会同时更新。 软链接和硬链接的区别 下表列出了软链接和硬链接之间的区别。 image.png

3.2K20

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

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

1.3K30

动态链接后ELF的Section Name

背景 在So动态链接后,读取ELF文件,发现无法读取Section Header的名称列表。即,无法在EShdr根据e_shstrndx找到Section对应的名字。...而在运行时候的动态链接是根据Segment来加载So的文件,原因是希望尽可能小的使用内存页面,并且提升加载速度。 ?...ELF链接与执行时视图 于是查看程序头部分,发现LOAD类型的段,仅仅只有.dynstr这个字符串表会被加载到内存。 ?...程序头 也就是说: 在So动态链接到内存时,.shstrtab和.strtab这两个Table是并没有加载到内存的。ld仅仅只会加载.dynstr这个Table就够用了。...shstrtab 结论 shstrtab与strtab这两个表仅仅只是链接后保存在So文件的,而在链接之后的执行视图层面,这两个字符串表不会被加载到内存

1.2K30

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

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 目录 动态链接要解决什么问题?...在上一篇文章,我们一起学习了Linux系统 GCC编译器在编译可执行程序时,静态链接过程是如何进行符号重定位的。 为了完整性,我们这篇文章来一起探索一下:动态链接过程是如何进行符号重定位的。...解决这个矛盾的方案,就是Linux系统动态链接器的核心工作! 解决矛盾:增加一层间接性 David Wheeler有一句名言:“计算机科学的大多数问题,都可以通过增加一层间接性来解决。”...动态库的加载过程 动态链接器加载动态库 当执行main程序的时候,操作系统首先把main加载到内存,然后通过.interp段信息来查看该文件依赖哪些动态库: 上图中的字符串/lib/ld-linux.so...ld-linux.so.2也是一个动态链接库,在大部分情况下动态链接库已经被加载到内存中了(动态链接库就是为了共享),操作系统此时只需要把动态链接库所在的物理内存,映射到 main进程的虚拟地址空间中就可以了

1.7K11

CC++|链接|动态链接

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

56220

翻译 | Linux利用动态链接共享对象库提权

Linux利用动态链接共享对象库提权 RPATH和弱文件权限会导致系统的损害。...Linux应用程序可以利用动态链接的共享对象库(我们从现在开始称它们为共享库)来提供应用程序功能,而不必重复编写相同的代码-有点像Windows应用程序的DLL文件。...就像在Windows上的DLL植入攻击一样,Linux共享库与弱文件权限相结合,可以用来执行任意代码并危害Linux系统。 操作系统如何查找共享库?...运行使用共享库的应用程序时,操作系统按以下顺序搜索库(来自https://linux.die.net/man/1/ld): 任何由rpath-link选项指定的目录(由rpath-link选项指定的目录仅在链接时有效...) 任何由rpath选项指定的目录(rpath选项指定的目录都包含在可执行文件,并在运行时使用) LD_RUN_PATH LD_LIBRARY_PATH DT_RUNPATH或DT_RPATH的目录

2.3K50
领券