博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系
阅读量:4178 次
发布时间:2019-05-26

本文共 1855 字,大约阅读时间需要 6 分钟。

============================================================
linux中搜索动态库的顺序
============================================================

Linux 运行的时候,是如何管理共享库(*.so)的?

在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。 ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。

但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?

目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf,然后运行 ldconfig 生成 /etc/ld.so.cache。 ld.so 加载共享库的时候,会从 ld.so.cache 查找。

传统上,Linux 的先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so 加载共享库的时候,也会查找这个变量所设置的路经。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

export LD_LIBRARY_PATH

但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量

=============================================================================

ldd 的作用

==============================================================================

 ldd 命令的作用是 打印共享库的依赖关系

1、首先ldd不是一个可执行程序,而只是一个shell脚本

2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、       LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的 dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:

  (1) export LD_TRACE_LOADED_OBJECTS=1
  (2) 再执行任何的程序,如ls等,看看程序的运行结果

3、ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载

  器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

4、实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)

==============================================================================

ldconfig 工具的作用

==============================================================================

ldconfig是一个动态链接库管理命令。其目的是为了让动态链接库为系统所共享。

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

ldconfig命令的使用时机

ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

FROM: http://blog.chinaunix.net/space.php?uid=618047&do=blog&id=2086669

转载地址:http://vntai.baihongyu.com/

你可能感兴趣的文章
RHEL/CentOS 7的systemd及其systemctl命令概述
查看>>
RHEL/CentOS 7的systemd target及其中的multi-user.target
查看>>
RHEL/CentOS 7中通过systemd service持久化网络命名空间
查看>>
Docker daemon及容器实例的DNS配置详解
查看>>
RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解
查看>>
RHEL/CentOS 7中的iptables.service与firewalld.service概述
查看>>
RHEL/CentOS 7中的SELinux概述
查看>>
SELinux的运行模式与安全策略详解
查看>>
Linux资源的SELinux context详解
查看>>
SELinux检查与Nginx的反向代理的典型错配案例及解决
查看>>
SELinux检查与Apache HTTP服务器的文件访问典型错配案例及解决
查看>>
Docker容器启动时的第一个进程的设置总结
查看>>
eclipse遇到的第一个问题
查看>>
Java中的内存管理(栈和堆、方法区)
查看>>
二进制 转换方法
查看>>
数组相关(定义、访问、遍历、复制/扩容、排序)
查看>>
面向对象基础梳理
查看>>
ArrayList数组集合方法一览
查看>>
序列化与反序列化
查看>>
IO流总结
查看>>