linux安装与包管理(管理共享库)
静态和动态可执行程序
Linux 系统有两类可执行程序。
- 静态链接的 可执行程序包含它们所需的所有库函数。所有库函数都链接到可执行程序中。它们是完整的程序,不依赖于外部的库。静态链接程序的优点是它们不要求事先安装任何东西就可以运行。
- 动态链接的 可执行程序要小得多,是不完整的,需要来自外部共享 库的函数才能运行。除了更小之外,动态链接还允许包指定依赖的库,而不需要将库包含在包中。使用动态链接还允许许多运行的程序共享库的一个副本,这就避免了相同代码的许多副本占据内存。由于这些原因,当今的大多数程序采用动态链接。
在典型的 Linux 系统上,一个有意思的例子是 ln
(/bin/ln)命令,它在文件之间创建链接,包括硬 链接和软(或符号)链接。共享库常常涉及库的通用名和库的特定级别之间的符号链接,所以如果链接不起作用了,那么可能是 ln 命令出故障了。为了防止这种情况,Linux 系统包含 ln 程序的一个静态链接版本,即 sln
程序(/sbin/sln)。清单 19 展现这两个程序在大小方面的巨大差异。
清单 19. sln 和 ln 的大小
|
|
ldd 命令
知道了静态链接的程序可能比较大之后,又如何判断程序是否是静态链接的呢?而且,如果程序是动态链接的,又如何知道它需要哪些库呢?这两个问题的答案都是使用 ldd
命令,这个命令显示可执行程序的库需求信息。清单 20 显示 ldd 命令对于 ln 和 sln 可执行程序的输出。
清单 20. ldd 对于 sln 和 ln 的输出
|
因为 ldd 实际上关注动态链接,所以通过显示 “not a dynamic executable” 来表示 sln 是静态链接的;对于 ln 命令,它指出两个共享库的名称(libc.so.6 和 ld-linux.so.2)以及这些库的位置。注意,.so 表示这些是共享对象 或动态库。在清单 21 中,我们使用 ls -l
命令显示这些实际上是库的特定版本的符号链接。
清单 21. 库符号链接
|
|
动态装载
您可能会吃惊,ld-linux.so 看起来像共享库,但是实际上它本身就是一个可执行程序。这是负责执行动态装载的代码。它从可执行程序读取头信息,这些信息采用 Executable and Linking Format(即 ELF)格式。它通过这些信息判断必要的库和需要装载的库。然后,它执行动态链接,修改可执行程序和装载的库中的所有地址指针,使程序能够运行。
您找不到 ld-linux.so 的手册页,但是 ld.so 的手册页(man ld.so
)中提到了它。清单 22 演示使用 ld-linux.so 的 --list
选项显示 ln 命令的库需求信息,这与清单 20 中用 ldd 命令显示的信息相同。
清单 22. 使用 ld-linux.so 显示库需求信息
|
注意,这两个清单中的十六进制地址是不同的,这在两次运行 ldd 时也可能不同。
|
动态库配置
那 么,动态装载程序如何知道去哪里寻找可执行程序呢?与 Linux 上的许多东西一样,在 /etc 中有配置文件。实际上,有两个配置文件,即 /etc/ld/so/conf 和 /etc/ld.so.cache。清单 23 显示两个不同系统上 /etc/ld.so.conf 的内容。注意,在 attic4 系统上(运行 fedora Core 4),/etc/ld.so.conf 指定应该包含来自子目录 ld.so.conf.d 的所有 .conf 文件。在您的系统上,/etc/ld.so.conf 文件的实际内容可能不一样。
清单 23. /etc/ld.so.conf 的内容
|
程序的装载需要快速,所以 ld.so.conf 被传递给 ldconfig
命令,以便处理来自 ld.so.conf.d 的所有库以及来自受信任目录(/lib 和 /usr/lib)的库。动态装载程序使用 ld.conf.cache 文件定位要动态装载和链接的文件。如果修改了 ld.so.conf(或者在 ld.so.conf.d 中添加了新的包含文件),那么必须运行 ldconfig
命令(作为根用户)来重新构建 ld.conf.cache 文件。
一般情况下,使用 ldconfig 命令(不带参数)来重新构建 ld.so.cache。可以指定几个参数来覆盖默认行为。与往常一样,使用 man ldconfig
获得更多信息。清单 24 使用 -p
参数显示 ld.so.cache 的内容。
清单 24. 使用 ldconfig 显示 ld.so.cache
|
如果正在运行一个老式应用程序,它需要一个共享库的旧版本,或者您正在开发新的共享库或共享库的新版本,那么可能希望覆盖装载程序使用的默认搜索路径。在脚本使用产品特有的共享库(安装在 /opt 树中)时,也可能需要这么做。
正如可以通过设置 PATH 变量来指定可执行程序的搜索路径一样,可以将 LD_LIBRARY_PATH 变量设置为搜索共享库的目录列表(用冒号分隔),搜索这些目录之后才会搜索在 ld.so.cache 中指定的系统目录。例如,可以使用下面这样的命令:
export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib
在本教程的其余几节中,我们将讨论包管理。
linux安装与包管理(管理共享库)相关推荐
- linuxpip安装python包_Windows+Linux安装Python包管理工具pip
Windows+Linux安装Python包管理工具pip Windows安装Python包管理工具pip pip是一个Python包管理工具,主要是用于安装PyPI上的软件包,可以替代easy_in ...
- Linux安装VNC远程桌面管理工具
Linux安装VNC远程桌面管理工具 Linux远程桌面连接方式 虽说高级的Linux运维工程师管理Linux时都是使用"高大上"的命令行操作,可是在有些时候例如Oracle数据库 ...
- Linux下构建自己的C++共享库并配合pkg-config生成链接选项
Linux下构建自己的C++共享库并配合pkg-config生成链接选项 本文将以C++链表的新建.打印操作为例构建自己的共享库,并在实际调试代码时尝试使用.我们在做数据结构题时经常需要将链表打印出来 ...
- linux安装及配置c++的opencv库
linux安装及配置c++的opencv库 前言: 最近想搞个机器视觉的比赛,要求是linux+opencv环境,没有做过opencv开发的我配置环境就配了两天,看来很多乱七八糟的博客,终于装好了.网 ...
- Linux安装RPM包、查看本机ip和端口、手动配置ip、中标麒麟无法显示ip地址的详细解决方法
文章目录 安装rmp Linux安装RPM包.DEB包后,软件在哪 RPM包安装去向(例:包名=>redis) 查看本机ip 查看所有端口 手动配置ip 中标麒麟无法显示ip地址的详细解决方法 ...
- IBM的LPI复习资料之LPI101-Topic102:Linux安装和包管理(1)硬盘分区
摘要 学习如何为Linux系统设计硬盘分区布局.本文用来备考LPI 101 或者仅仅是为了兴趣. 概述 在本文学习为Linux系统设计硬盘分区布局,具体说来是: 为文件系统或者交换空间分配单独的分区 ...
- linux安装python包_【Linux】非root安装Python3及其包管理
1. Python 3.8.1安装 源码安装常规操作: wget -c https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz tar -xv ...
- linux会话管理,Linux 安装 screen 远程会话管理工具
在使用景文互联的Linux 云服务器产品编译一些环境时,您可能需要花费不少的时间,如果编译时间过长,可能导致当前SSH会话超时,从而断开了SSH,也终止了环境编译的进程,这对用户使用体验非常不利,所以 ...
- Linux安装R包有什么依赖关系,linux下安装配置R环境相关依赖包
我的系统是ubuntu12.04,安装相应的包即可. 向 /etc/apt/sources.list 中加入: deb http://archive.ubuntu.com/ubuntu precise ...
最新文章
- ebnf描述c语言语句结构,EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则...
- 深度学习光环背后,机器学习的一些新进展!!!
- 深入地下,实地探访!不用人挖煤的智能煤矿长什么样?
- ECMAScript 6入门
- 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法
- verilog 基础篇 signal_tap 的使用
- iphone屏幕上的圆圈怎么设置_iphone亮度条不变屏幕变暗怎么回事【解决方法】
- 算法:由0-5随机数设计0-8随机数
- 我的docker随笔18:阿里云docker仓库的使用
- Lambda学习笔记
- 基于JAVA+SpringMVC+Mybatis+MYSQL的在线问卷答题系统
- 企业架构 - 涉众管理(Stakeholder Management)
- 图片标注工具LabelImg使用教程
- 计算机涉及数学知识点,2019计算机考研数学知识点解读:一元函数积分学
- 微信小程序人脸识别获取照片,并解决相机拍照在ios上有声音问题
- 华为交换机端口vlan详解
- RNA二级结构系列(1):基础知识篇
- 473. 火柴拼正方形
- iperf 工具使用
- [iOS]上传图片和音视频到阿里云
热门文章
- 普通人怎么建立自己的被动收入?我有几点建议
- 一种单键开/关机电路,实现手机电源键功能:长按开机、长按关机、轻触开/锁屏
- Hadoop集群SSH无密登录
- 我的utool使用体验~
- 使用 setTimeout 代替 setInterval
- 做知识付费怎么推广课程?
- 前后端数据交互——ajax技术
- 九、T100销售管理之出货管理
- PHP基础学习第十三篇(了解PHP的作用、PHP的语法、PHP的安装、PHP的开发工具、变量、输出(echo与print)、EOF(heredoc)多行字符串理解、最后总结)
- quartz 每月一次_quartz cron表达式:启动时先执行一次 以后每个月执行一次,怎么做?...