Linux 共享库

Linux 系统上有两类根本不同的 Linux 可执行程序。第一类是静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 —换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。

  第二类是动态链接的可执行程序。

静态可执行程序与动态可执行程序比较

  我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的:
  # ldd /sbin/sln
  not a dynamic executable
  “not a dynamic executable”是 ldd 说明 sln 是静态链接的一种方式。现在,让我们比较 sln与其非静态同类 ln 的大小:
  # ls -l /bin/ln /sbin/sln
  -rwxr-xr-x 1root root 23000 Jan 14 00:36 /bin/ln
  -rwxr-xr-x 1root root 381072 Jan 14 00:31 /sbin/sln
  如您所见,sln 的大小超过 ln 十倍。ln 比 sln小这么多是因为它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。

动态链接相关性

  要查看 ln 依赖的所有共享库的列表,可以使用 ldd 命令:
  # ldd /bin/ln
  libc.so.6 => /lib/libc.so.6 (0x40021000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2(0x40000000)

  如您所见,ln 依赖外部共享库 libc.so.6 和ld-linux.so.2。通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。例如,sln是修改位于 /lib 中的不同库符号链接的极佳工具。但通常您会发现几乎所有 Linux系统上的可执行程序都是某种动态链接的变体。

 动态装入器

  那么,如果动态可执行程序不包含运行所需的所有函数,Linux的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamicloader),它实际上是您在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们迅速查看一下动态装入器如何在系统上找到适当的共享库。

  ld.so.conf

  动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您对/etc/ld.so.conf 文件进行 cat 操作,您可能会看到一个与下面类似的清单:

  $ cat /etc/ld.so.conf

  /usr/X11R6/lib

  /usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3

  /usr/lib/mozilla

  /usr/lib/qt-x11-2.3.1/lib

  /usr/local/lib

  ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。

  ld.so.cache

  但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig命令做到这一点:

  # ldconfig

  当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对/etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf中指定的所有新目录。

ldconfig 技巧

  要查看 ldconfig 可以“看到”的所有共享库,请输入:

  # ldconfig -p | less

  还有另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。

  LD_LIBRARY_PATH

  要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:

  # export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

  导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用/usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf中指定的库。

转载于:https://blog.51cto.com/wushank/1287160

linux共享库及/etc/ld.so.conf文件的应用相关推荐

  1. UNIX 环境高级编程(二)—— linux共享库,/etc/ld.so.conf 及 ld.so.conf.d/libc.conf

    1. Linux 共享库(/etc/ld.so.conf) 这个文件记录了编译时使用的动态链接库的路径.默认情况下,编译器只会使用 (1)/lib. (2)/usr/lib 这两个目录下的库文件. 如 ...

  2. linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf)

    linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf) 转载于:https://www.cnblogs.com/RichardLee/archiv ...

  3. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  4. Linux共享库路径配置

    Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译链接可以正常进行,但是在运行时出现如"error while loa ...

  5. Linux 共享库简介(怎样创建共享库)

    前言 0x1 什么是共享库 0x2 共享库在文件系统中的位置 0x3 使用 ldconfig 命令 0x4 使用非标准库位置 0x5 示例(如何创建一个共享库) 前言 一个库文件由多个不同的目标文件填 ...

  6. 解决qt工程文件.pro配置、LIBS添加、ld.so.conf文件添加、库文件权限设置等一系列问题

    对于Linux小白来说,使用Qt+官方提供的库和demo获取摄像头数据流居然都会到处碰壁,捯饬了一天才搞定,现在记录下所有的过程. 在大华官网下载的.run,安装挺顺利,由于版本问题,还卸载了两次,一 ...

  7. linux共享库 == windows动态库

    linux共享库  == windows动态库     之间基本等同.

  8. apache源码安装必须依赖的库apr----/etc/ld.so.conf 文件介绍

    Apache所依赖的库,封装了各个系统相关的API等.虽然都是Apache开发的,但是现在最新版本的Apache和APR源码是分开的.要编Apache就必须使用APR. /etc/ld.so.conf ...

  9. Linux共享库概述

    Linux共享库概述 共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术.这种技术能够节省磁盘空间和RAM. 在继续阐述共享库之前,先来说说静态库,它是比共享库更早的存在.静态库也 ...

最新文章

  1. iphone相关总结
  2. Deno 兼容浏览器具体指的是什么?
  3. 耗时 3 天,上亿数据如何做到秒级查询?
  4. PROCESSES, SESSIONS和CONNECTIONS的区别
  5. Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号
  6. 让Eclipse变得快点,取消validation
  7. Windows在当前目录(文件)打开cmd窗口
  8. 斐讯k2华硕虚拟服务器,斐讯K2路由器三步刷入华硕固件
  9. 计算机休眠唤醒后 网络受限,彻底解决win10系统待机、休眠被唤醒后笔记本WIFI无线网无法连接的问题-网络教程与技术 -亦是美网络...
  10. Android科大讯飞TTS语音合成实例详细步骤
  11. 卢松松:寄生式创业更容易成功
  12. android http下载限速,安卓手机端两种让网盘不限速下载方法介绍
  13. Windows 正版系统安装(重装) - Win10(微星主板 - MSI)
  14. 策略模式、工厂模式、装饰者模式总结解析
  15. Linux(Debian)安装Geany教程
  16. 【搜索】单词方阵 luogu-1101
  17. C语言读写BMP图片(附Github下载链接和视频讲解地址)
  18. python怎么安装whl文件
  19. 1875.贝茜的报复
  20. maven详解2020

热门文章

  1. 2015/10/9 Python核编初级部分学习总结
  2. 关于js的function.来自百度知道的回答,学习了.
  3. 求解:nhibernate2.0操作oralce提交事务时报错
  4. Java自定义JSlider UI
  5. LeetCode—210. 课程表 II
  6. oracle instant client配置(MAC OS)
  7. final关键字与static对比
  8. APP:分享六款非常实用的冷门APP软件,值得一试!
  9. JAVA:说说你对序列化的理解
  10. .NET Core 3.0 中的新变化