IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux动态库加载研究 -> 正文阅读

[系统运维]Linux动态库加载研究

? ? ? ? 引子(ELF文件格式)

????????在分析Linux动态库加载过程之前,首先介绍Linux系统中的可执行与可链接格式(Executable and Linkable Format,ELF),该文件格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式,Linux下的执行体、so、o和bin等文件都符合该格式。

????????ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。ELF文件格式的结构如下图所示,实际上一个ELF文件中不一定包含全部内容,而且它们的位置也未必如图所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。

?????????ELF文件的相关信息可以通过readelf命令(有关readelf命令详情可在网上查询,本文不详细讲)来查看,其中文件中有一个.dynamic的节,里面的信息可通过命令: readelf –d xxx.so来查看,例如:readelf ?–d ?libProtoPackLib.so来查看libProtoPackLib.so文件的.dynamic节信息,如下图所示:

?

?????????在该段中记录有依赖的动态库(NEEDED)信息和动态库搜索路径(RPATH)。

????????动态库加载机制

?????????Linux操作系统中对于动态链接库都是利用ld-linux.so.2去加载的,加载过程如下:

?????????总体来说,就是在加载一个动态库之前会按照ELF文件格式,去读取这个动态库还依赖的动态库,并读取动态库搜索路径(如果这个RPATH存在),并以该搜索路径为起点,依次搜索LD_LIBRARY_PATH,/etc/ld.so.conf中指定的路径,最后到/lib或者/lib64中去搜索,在其中任意一个位置搜索到后完成依赖库的加载后便返回。

?????????动态库搜索路径指定

  1. 通过RPATH指定搜索路径

?????? 只需要在编译生成动态库的连接选项中增加-rpath选项即可,多个搜索路径以::分隔,以CodeBlocks平台为例,如下所示:

?????????????? 其格式为:-Wl,-rpath=serch path1: serch path2

?????? ????????加入该选项后,最终执行的链接命令最终的编译指令就是:

????????????????gcc test.c -lhello -L . -Wl,-rpath serch path1: serch path2

?????? ????????在编译生成共享库后就会将serch path1和serch path2写入对应的.dynamic节中。

???????????????2.?通过LD_LIBRARY_PATH指定搜索路径

?????????可以通过echo $ LD_LIBRARY_PATH查看当前的LD_LIBRARY_PATH

???????? 临时性的指定,可以执行命令来增加一个路径/tmp

????????export ?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp?

????????若需要持久性地增加一个路径/tmp,可修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile等文件,在其文件中增加:

????????export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH

????????然后保存改文件,并执行

????????source .bashrc 或者source .bash_profile或者source/etc/profile

? ? ? ? 修改了哪个文件对改文件执行source生效。

???????????????3.?通过/etc/ld.so.conf指定搜索路径

?????? 打开该文件在其中增加需要指定的路径如:??? /tmp

????????然后执行ldconfig命令,使得修改生效,ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。???????

? ? ? ? 4. 将动态库拷贝至/lib或者/lib64

????????将需要的动态库直接拷贝至该目录下即可。

?

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 16:03:51  更:2022-02-28 16:07:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:42:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码