Linux中的共享链接库shared libraries
可执行文件的静态链接和动态链接
静态链接会将需要的库函数在编译时一并包含, 所以体积会比较大.
使用ldd命令查看可执行文件链接的库
$ ldd /sbin/ldconfig
not a dynamic executable
$ ldd /bin/ln
linux-vdso.so. => (0x00007fff4dbcd000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007fbcb3b39000)
/lib64/ld-linux-x86-.so. (0x0000558d79c26000)
如果是静态链接的, 会显示"not a dynamic executable", 如果是动态链接的, 会显示链接的对象, 有3种类型
linux-vdso.so.1
这是虚拟动态共享对象Linux Virtual Dynamic Shared Object
libc.so.6
这是一个链接, 指向/lib64/libc.so.6 或 /lib/i386-linux-gnu/libc.so.6. 这将便于系统升级后, 可执行文件不需要更改直接使用
/lib64/ld-linux-x86-64.so.2
库文件的绝对路径
虚拟动态共享对象 Linux Virtual Dynamic Shared Objects
在早期的x86处理器中, 用户程序与监护服务通过软件中断进行通信. 在处理器速度提升后, 这就成为一个瓶颈, 从Pentium® II处理器开始, 引入了一个Fast System Call方式用于加速系统调用, 使用SYSENTER and SYSEXIT指令取代了中断. 你看到的linux-vdso.so.1是一个虚拟库, 又称虚拟动态共享对象, 会存在于每个程序的地址空间, 在一些发行版中叫linux-gate.so.1, 这个虚拟库提供了用户程序访问系统方法的最快途径, 可能是中断, 对于新处理器, 也可能是Fast System Call
动态加载
从上面可以看到, /lib/ld-linux.so.2 和/lib64/ld-linux-x86-64.so.2 看起来是动态链接库, 但其实都是可执行文件, 它们主要是负责动态加载: 从可执行文件读取头部信息(Executable and Linking Format (ELF) 格式). 从这个信息, 可以知道需要哪些链接库, 哪些需要加载, 然后动态地将可执行文件以及加载的链接库中的地址指针链向正确的地址.
使用ld-linux同样可以查看ldd信息, 注意: 每次ld-linux, 以及每次ldd查看到的地址都可能会变化
/lib64/ld-linux-x86-.so. --list /bin/ln
linux-vdso.so. => (0x00007ffc8eb34000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007f4756f36000)
/lib64/ld-linux-x86-.so. (0x0000556f8d784000)
动态链接库配置
动态加载是如何知道在哪里查找链接库呢? 主要是通过 /etc/ld.so.conf 和 /etc/ld.so.cache. 通过 /etc/ld.so.conf 可以看到实际加载的链接库. ldconfig命令用于处理ld.so.conf及其关联的所有配置, 从可信任的路径(/lib, /usr/lib)以及命令行中指定的路径中包含的库文件. ldconfig会在/etc/ld.so.cache中记录必要的链接和缓存, 如果修改了ld.so.conf, 需要执行ldconfig来重建/etc/ld.so.cache
一般不带参数执行ldconfig命令会重建ld.so.cache. 可以带上-p参数用于重建时显示ld.so.cache的内容
加载指定的库文件
如果运行的应用需要一个旧版本的动态链接库或者一个更新的动态链接库, 你就会需要指定库文件路径以覆盖默认的查找路径. 在一些使用特定版本库文件的产品中也存在这种情况. 你可以使用LD_LIBRARY_PATH来指定一系列的路径(用冒号分隔), 这些路径会优先于ld.so.cache中设定的路径, 例如
export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib
编译安装Libevent-2.1.8的安装完成提示
Libraries have been installed in:
/opt/lib/libevent/lib If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for
more information, such as the ld() and ld.so() manual pages.
CFLAGS="-Idir1 -Idir2 -Idir3" LDFLAGS="-Ldira -Ldirb -Ldirb"
Linux中的共享链接库shared libraries的更多相关文章
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- Linux中的软硬链接
说到Linux中的软硬链接,就必须谈一下Linux的文件系统的组成的重要部分iNode和block. 首先是iNode,先用一张图了解一下iNode在Linux文件系统中的地位: Linux中的文件的 ...
- 【linux排错】"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: lcw: error : cannot open shared object file: No such file ...
- linux动态链接库和静态链接库
Linux下静态链接库与动态链接库的区别 引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件 (object file)与牵涉到的函数库(librar ...
- GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件
我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go ...
- linux脚本: makefile以及链接库
Linux makefile 教程 非常详细,且易懂 http://blog.csdn.net/liang13664759/article/details/1771246 //sort.c #incl ...
- Cloning EBS from Linux 5 to Linux 6 Fails: "Error While Loading Shared Libraries: libclntsh.so.10.1
SYMPTOMS During clone Oracle Applications R12 from Linux 5 to Linux 6 the following error occurs ...
- Linux中使用京东代码库JDCode创建私有Git仓库
国外Git经常被墙,所以目光转向国内.目前,云存储真的是很热,有很多公司在做. 看了一下,CSDN,开源中国,淘宝,京东,Gitcafe都在搞.淘宝只支持SVN. JD号称提供1G免费空间,而且支持私 ...
- linux中的硬链接和软链接是什么
Linux 文件系统最重要的特点之一是它的文件链接.链接是对文件的引用,这样您可以让文件在文件系统中多处被看到.不过,在 Linux 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行 ...
随机推荐
- 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础
本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...
- 网络编程之webclient和httpwebrequest的使用
(1)Lambda表达式 “Lambda表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型. 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符 ...
- [填坑]解决"Your MaintenanceTool appears to be older than 3.0.2. ."问题
之前我写过QT5.9版本在更新组件时出现“要继续此操作,至少需要一个有效且已启用的储存库”问题,得到了网友的热心转载,说明遇到此问题的人不在少数. 原文地址:https://blog.csdn.net ...
- (使用STL中的数据结构进行编程7.3.15)UVA 630 Anagrams (II)(求一个单词在字典中出现的次数)
/* * UVA_630.cpp * * Created on: 2013年11月4日 * Author: Administrator */ #include <iostream> #in ...
- sql server 由于登入失败而无法启动服务
到控制面板——管理工具——服务,找到mssqlserver这个服务,在属性里把登陆帐户改成你目前登录windows的帐户或选择本地系统账户再重新启动服务就好了
- Java-JUC(四):同步容器介绍
同步容器简介 针对容器我们知道有HashMap,HashTable,其中HashMap是一个非线程安全的,HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%.因为多线程会导 ...
- Linux中挂载新的磁盘到指定目录或分区
新增磁盘的设备文件名为 /dev/vdb 大小为100GB. #fdisk -l 查看新增的的磁盘 1.对新增磁盘进行分区 #fdisk /dev/vdb 按提示操作 p打印 n新增 d 删除 w ...
- spring 读取配置文件,将值注入到静态字段
resources/config/config-dev.properties es.ip.node=xxxxxxxcluster.name=xxxxxxxclient.transport.sniff= ...
- [PureScript] Introduce to PureScript Specify Function Arguments
JavaScript does its error-checking at runtime, but PureScript has a compiler, which makes sure that ...
- Slitaz 中文定制手册
源: http://www.simplemind.info/technolife/opensource/slitaz-cn.html 有关 Slitaz 的一些网站 slitaz的网站:http:// ...