在现今的软件开发中,代码的复杂度与日俱增,涉及的代码库数量也越来越多,这使得代码的维护与管理变得更为复杂。而动态链接技术能够为代码的开发与维护提供一定的便利,让不同的代码库能够相互通信与依赖。本文将介绍Linux动态链接的相关知识,以及如何更好地管理代码依赖性。
一、什么是 Linux 动态链接?
简单来说,动态链接就是在运行时将程序需要的库文件动态加载到内存中,而不是在编译时将相应的库文件链接到程序中。这样做的好处是:
1. 减少程序文件的体积;
2. 提高代码的复用性和可维护性;
3. 使得程序的更新更为便捷;
4. 弥补静态链接的局限性(例如C++代码中涉及到的一些RTTI操作,需要在运行时动态链接相关的库文件)。
以之前常说的C/C++为例,静态链接时编译器会将库文件的代码完整地打包在程序中,而动态链接则将库文件作为独立的文件存在,运行时才被加载到内存中。
二、动态链接的实现机制
动态链接的实现是通过“动态链接器”来完成,这个链接器可以根据程序运行时的需要动态地加载所需要的库文件,并将其链接到程序中。动态链接器出现在程序空间中的形式为动态链接库(Dynamic Link Library,简称DLL)。
动态链接库:
1. 是一个可执行的文件,实际上也是一个Object文件;
2. 包含了一组函数(有时成为模块);
3. 在运行时才被加载到主程序中;
4. 提供动态链接和动态装载服务。
其中有两个比较重要的概念:PLT(Procedure Linkage Table)和 GOT(Global Offset Table)。
PLT 表挂在 Process 的内存空间中,其中每个 Table Entry 都指向一个桩函数。这个桩函数的作用是计算出真正的函数地址,并保存到 GOT 表中。在之一次发生函数调用时,由于 GOT 表中的地址为空,此时程序会跳转至 PLT 表中的桩函数,桩函数将获取真正的函数地址,并将其保存到 GOT 表中。这个真正的函数地址就是被动态链接器解析到的地址,最终程序会跳转到这个地址上去执行对应的函数。
三、如何管理代码依赖性
1. 确定库文件的位置
在Linux中,库文件的位置默认情况下为/lib和/usr/lib。但是在实际开发中,当你需要使用自己编写的库时,需要将其安装到特定的目录中,并在程序中指定库文件的位置。你可以使用LD_LIBRARY_PATH环境变量来指定库文件的路径,环境变量中的路径是按照先后顺序来加载的。
2. 确定库文件名
针对动态链接的库文件,必须遵循一定的命名规范,遵循这个规范将可以有效的辨别其是否为动态链接库。
以Linux下动态链接库的命名规范为例:库文件的名字以lib开头,紧接着是库的名称,然后是库的版本号。例如:libz.so.1.2.8。
其中的z是库的名称,.so表示Shared Object库的格式,而.1.2.8则是库的版本号。你可以使用ls -l /lib/libc*命令查看所有libc库文件的版本号。
3. Makefile文件的编写
在开发过程中,我们经常使用Makefile工具来方便地管理代码的编译和构建。而针对动态库的编译时需要特别注意以下几点:
1)在Makefile文件中指定编译时的选项(例如 -largument);
2)在程序中通过指定库的名称与版本号进行链接,例如 gcc mn.c -lz.1.2.8。
如果你需要将自己编写的库文件作为静态库或者动态库来使用,就需要将其打包成一个二进制文件。这是比较简单的,可以使用一些工具来实现,例如ar和ld。其中ar主要用来将目标文件打包成一个包含库文件信息的文件,而ld则用来将库文件链接到程序中。
四、
动态链接技术是一种相对于静态链接更加灵活和高效的链接方式,在代码开发和维护中提供了更多的便利性。但是,管理代码依赖性的过程也是需要仔细考虑和规划的。通过本文的介绍,希望能够对Linux动态链接与代码依赖性的管理有更为全面的了解。
相关问题拓展阅读:
怎么条用linux中动态链接库里面的函数
在dlopen()函数以指定模式打开如源指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlcLose()来卸载打开的库。
当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的之一个参数,以获得符号在渣扰态库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调李梁用装载库中的相应函数。
linux中动态链接的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux中动态链接,Linux动态链接:如何更好地管理代码依赖性?,怎么条用linux中动态链接库里面的函数的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
什么是动态链接库?
什么是DLL 什么是DLL呢? DLL(动态连接库),既然是动态,那么就是有静态连接库,我想如果这么说大家 会更明白: 也许有的人在DOS下编写过程序都明白这么一件事情,我写了一个程序,里面有一 个功能就是把屏幕的内容翻转在转90°打印出来,那么我需要把整个程序写好放 到我的所有代码中,但是如果我写另外一个程序的时候也有相通的功能,我可以 调用以前的程序这个功能吗?当然是不可以的了,所以我就要重新的写一次,如 果有5个需要调用这个功能的程序,我的这个功能函数需要20K的地方,那么我的 硬盘就有80K的垃圾出现(20k*5 - 20k),这仅仅是一个函数,大家是否可以数 清除WINDOWS如果这样来写,需要多少函数吗?你看看所有的按钮、滚动条、 Listbox\Textbox\checkBox\窗体、打印对话框、颜色对话框、打开、保存、另存 、字体对话框、文件的排列、拷贝、粘贴...... 这一切的一切是不是都需要在所 有的程序中都要写出来呢?如果真的是这个样子,那么我们的windows应该按TB来 计算了(1TB=1024GB),也许你说你的硬盘很大,那么他们还要在运行的时候占 用相同大下的内容呢!所以发展出来了,动态连接库(dll)这个感念: 动态连接,就是把这些相通的功能、函数都放到一种特殊形式的windwos可执行文 件中(dll),生成一个DLL的时候,程序员需要写出,其中包含那些函数需由其 他程序来访问。 这个过程叫做对函数的“导出” 创建windows程序的时候,专门的连接程序对程序的对象文件进行扫描,并生成一 个列表,列出那些调用的函数在那个DLL那个位置,指定各个函数所在位置的过程 叫做对函数的“导入”,当程序运行的时候,一旦要求用到执行文件内部没有的 函数,windows就会自动装载动态连接库,使应用程序可以访问这些函数。 此时, 每个函数的地址都会解析出来,并且以动态的方式连接到程序里--这便是术语 “动态连接”的由来。 另外还有一个好处,就是当你更新你的这个函数的版本和功能的时候,静态连接 所需要做的工作是多少(假设按windwos来说他有上千个这样的函数,一共有100 多个程序来使用,那静态连接需要次的更新,动态连接只需要1000次) ,从而也节省了内存的空间。 动态连接库不一定是DLL扩展名的,也可以是ocx、vbx、exe、drv 等等的 大家可以发现在调用WIN32 api的时候里面都会有说明是来自于那个dll等宿主文 件的 现在我就在这里讲讲一些标准的dll用途: 看下面这个API声明: Public Declare Function GetWindowsDirectory Lib kernel32 Alias GetWindowsDirectoryA (ByVal lpBuffer As String, ByVal nSize As Long) As Long 看见kernel32了吗,其实这个就是的名字,你可以在你的硬盘里找 到他,这就是说GetWindowsDirectory这个函数是在里面,他的别名 是GetWindowsDirectoryA,()中是他的参数,有两个一个是字符型,一个是长 整型,返回值也是长整型。 lpBuffer ------- String,指定一个字串缓冲区, 用于装载Windows目录名。 除非是根目录,否则目录中不会有一个中止用的“\” 字符nSize ---------- Long,lpBuffer字串的最大长度,返回值 为Long,复制 到lpBuffer的一个字串的长度。 如lpBuffer不够大,不能容下整个字串,就会返 回lpBuffer要求的长度。 零表示失败。 这就是API声明的意义所在! DLL的说明 ---- 低级内核函数。 使用他可以完成内存管理、任务管理、 资源控制等。 ------于windows管理有关的函数。 消息、菜单、光标、计时器 、通信和其他大多数非现实函数都可以从这里找到 -------图形设备接口库。 于设备输出有关的函数:大多数绘图 、显示场景、图元文件、坐标及其字体函数都可以从这梨找到。 \\\---这都是提供一些附加函数的库,包 括通用对话框、文件压缩、版本控制的支持。 --------一个新的windows控件集合,比如TreeView和RichTextBox 等等,最初这个好像是为了win95而制作的,但是现在也使用与NT下 ---------提供了一套电子邮件的专用函数 --------提供了一套访问和控制网络的函数 --------(不用我再说了吧)ODBC功能的DLL之一 ------(这可不是WINDOWS的MM)是多媒体控制访问函数集合 windows api正在快速发展和变化,是你我任何单个人都追赶不上的速度发展,幸 运的是我们不用掌握所有的windows API,只是掌握需要经常使用的WINDOWs api 和他的常规结构、基本感念就可以了,这亮点很重要。
linux ls命令中-color是什么意思,最好详细点
man ls 看看就知道了:--color[=WHEN]colorizetheoutput. WHENdefaultsto`alwaysor can be `never or `auto.就是说在什么情况下(总是,从不,或自动)让ls的结果用彩色显示。 例如ubuntu下的ls其实是 ls --color=auto的别名。
如何更新linux系统动态链接库/usr/local/lib /usr/lib
可以放在当前目录下,但是要设置一下库文件的路径:LD_LIBRARY_PATH=./:/usr/local/pet20/lib:/lib/:/usr/local/lib export LD_LIBRARY_PATH 这样,在调用的时候就会自动从当前目录找。 如果是显式调用则不用,只要在程序里指定的文件路径就可以了。 所以放在当前目录下也是没问题的。
发表评论