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

Linux动态链接

最近又有一次碰到类似的问题,所以顺便把动态链接库的基本原理了解了一遍。 静态链接 静态链接库,在Linux下文件名后缀为.a,如libstdc++.a。在编译链接时直接将目标代码加入可执行程序。...动态链接 动态链接库,在Linux下是.so文件,在编译链接时只需要记录需要链接的号,运行程序时才会进行真正的“链接”,所以称为“动态链接”。...命名规则 动态链接库与应用程序之间的真正链接是在应用程序运行时,因此很容易出现开发环境和运行环境的动态链接库不兼容或缺失的情况。 Linux通过规定动态链接库的版本命名规则来管理兼容性问题。...) linux-vdso.so.1是内核提供的一个动态链接库,所以这里只有一个内存地址。.../lib64/ld-linux-x86-64.so.2是一个动态链接库的绝对路径。

5K91

链接 动态链接 静态链接

要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事: 符号解析 目标文件定义和引用符号...链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。 静态链接的输入文件是一系列的目标文件,输出是可执行的目标文件。...这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。 动态链接有是怎么回事呢?...,这个过程就叫做动态链接。...共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。 其实.symtab这个存放符号的地方也是值得研究的,有机会再记录。

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

    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称之为共享目标文件(Shared Object),文件后缀为.so,Windows的动态链接库(Dynamic Link Library)文件后缀为....ldd命令查看动态链接库依赖 在Linux上,动态链接库有默认的部署位置,很多重要的库放在了系统的/lib和/usr/lib两个路径下。...动态链接库查找过程 刚才提到,Linux动态链接库绝大多数都在/lib和/usr/lib下,操作系统也会默认去这两个路径下搜索动态链接库。...这些位置的动态链接库很多,如果链接器每次都去这些路径遍历一遍,非常耗时,Linux提供了ldconfig工具,这个工具会对这些路径的动态链接库按照SONAME规则创建软连接,同时也会生成一个缓存Cache...我们前面曾提到,Linux有个约定速成的规则,假如库名是name,那么动态链接库文件名就是libname.so。在使用GCC编译链接时,-lname来告诉GCC使用哪个库。

    8.9K30

    动态链接

    动态链接涉及运行时的链接及多个文件的装载,必需要有操作系统的支持,因为动态链接的情况下,进程的虚拟地址空间的分布会比静态链接情况下更为复杂,还有一些存储管理、内存共享、进程线程等机制在动态链接下也会有一些微妙的变化...目前主流的操作系统几乎都支持动态链接这种方式,在 Linux系统中,ELF动态链接文件被称为动态共享对象(DSO, Dynamic Shared objects),简称共享对象,它们一般都是以“so”为扩展名的一些文件...在 Linux中,常用的C语言库的运行库glib,它的动态链接形式的版本保存在“/lib”目录下,文件名叫做“ libc.so”。...的确,动态链接会导致程序在性能的一些损失,但是对动态链接链接过程可以进行优化,比如我们后面要介绍的延迟绑定( Lazy Binding)等方法,可以使得动态链接的性能损失尽可能地减小。...ProgramI除了使用Lb.so以外,它还用到了动态链接形式的C语言运行库libc-2.61so。另外还有一个很值得关注的共享对象就是ld-2.6so,它实际上是 Linux下的动态链接器。

    1.3K20

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

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

    1.6K70

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

    唯一不同的是静态类型的变化是通过强转实现的而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

    59120

    Linux动态链接库.so文件的创建与使用

    3、动态函数库,并非另外一种库函数格式,区别是动态加载函数库是如何被程序员使用的。 2....ldconfig并不设置链接的名字,通常的做法是在安装过程中完成这个链接名字的建立,一般来说这个符号链接就简单的指向最新的soname或者最新版本的函数库文件。...同时还必须有一个链接名字,例如 /usr/lib/libreadline.so就是一个符号链接指向/usr/lib/libreadline.so.3。 3.1.2....允许用户控制动态链接函数库将涉及到setuid/setgid这个函数,如果特殊的功能需要的话。因此,GNU loader通常限制或者忽略用户对这些变量使用setuid和setgid。...动态链接库.so文件的创建与使用 Linux动态库(.so)搜索路径 Linux 动态库与静态库制作及使用详解

    9.2K51

    LINUX链接和硬链接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。...在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索 引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。...软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。...[oracle@Linux]$ echo "I am f1 file" >>f1 [oracle@Linux]$ cat f1 I am f1 file [oracle@Linux]$ cat f2 I...am f1 file [oracle@Linux]$ cat f3 I am f1 file [oracle@Linux]$ rm -f f1 [oracle@Linux]$ cat f2 I am

    8.1K51

    Linux链接与软链接

    链接与软链接链接是通过inode进行的链接。...一般情况下,文件名和inode号码是“一一对应”关系,每个inode号码对应一个文件名,但是Unix/Linux系统允许多个文件名指向同一个inode号码,这意味着,可以用不同的文件名访问同样的内容,但是...硬链接只能在同一个文件系统的文件中间进行链接,不能对目录进行创建。如果删除硬链接对应的源文件,则硬链接文件仍然存在,而且保存了原有的内容,这样可以防止因为误操作而删除文件的作用。...可以使用ln 源文件 新文件 命令建立硬链接或者使用ln -d 源文件 新文件 命令建立硬链接。 通过上面的操作印证了前述关于硬链接的相关内容。...这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数不会因此发生变化。可以使用ln -s 源文件或目录 目标文件或目录 命令建立软链接

    8.7K30

    动态链接的相关结构

    ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE在Windows下的动态链接过程和它们的区别 但是在动态链接情况下,...所以在映射完可执行文件之后,操作系统会先启动个动态链接器( Dynamic Linker) 在 Linux下,动态链接器ld.so实际上是一个共享对象,操作系统同样通过映射的方式将它加载到进程的地址空间中...在LINUX下,可执行文件所需要的动态链接器的路径几乎都是 “/lib/ld-linux.so.2”,其他的*.nix操作系统可能会有不同路径。我们在后面还会介绍到各种环境下的动态链接器的路径。...在LINUX系统中,/lib/ld-linux.so.2通常是一个软链接,比如在我的机器中,它指向/lib/ld-linux.so.2,这个才是真正的动态链接器,在linux中,操作系统在对可执行文件所需要的相应动态连接器...当系统中的Glibc库更新或者安装其他版本的时候,/lib/ld-linux.so.2 这个软链接就会指向新的动态链接器,而可执行文件本身不需要修改 ".interp" 中的动态链接器路径来适应系统的升级

    1.7K20

    Linux链接与硬链接

    创建软链接链接是一个指向另一个文件或目录的引用,类似于Windows系统中的快捷方式。...ln -s [目标文件路径] [链接文件名]例如,要在当前目录下创建一个名为link_file的软链接,指向/home/user/desktop/link,可以执行以下命令ln -s /home/user...创建硬链接就像是创建了原始文件的副本,但实际上它们都指向相同的数据块。...删除软链接rm [软链接文件名]软链接与硬链接区别软链接就像是创建了一个快捷方式,指向另一个文件或目录。如果原始文件被删除或移动,软链接失效,因为它只是一个路径的引用。...可以跨越不同文件系统,例如/home/user,另一个在/mnt/data有一个特殊的标志,表示它是一个软链接文件。硬链接就像是创建了原始文件的副本,但实际上它们都指向相同的数据块。

    26610
    领券