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 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行 ...
随机推荐
- Java_Freemarker
ylbtech-Miscellaneos:Java_Freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源 ...
- Home Assistant 安装Samba和SSH server 插件
安装 Samba 插件 Samba 是 SMB/CIFS 网络协议的重新实现, 它作为 NFS 的补充使得在 Linux 和 Windows 系统中进行文件共享.打印机共享更容易实现. Smaba 服 ...
- RxJava RxPermissions 动态权限 简介 原理 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- C#开发winform程序的界面框架
首先创建一个“Windows应用程序”,默认的“Form1”文件修改为MainForm的窗体,作为程序的主窗体.从控件箱拖3个控件过来:MenuStrip.ToolStrip.StatusStrip. ...
- Introduction to Learning to Trade with Reinforcement Learning
http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ The academic ...
- 使用unbound在RHEL7上搭建DNS服务
1.概念:DNS (Domain Name Server)域名解析服务,使用TCP&UDP的53号端口(主从DNS之间用TCP,客户端查询使用UDP).它可以完成域名与IP地址的互换,可以通过 ...
- 【转】深入理解line-height
原文: http://www.cnblogs.com/dolphinX/p/3236686.html https://www.cnblogs.com/yangjie-space/p/4858132.h ...
- 如何屏蔽ctrl + v 粘贴事件,鼠标右键粘贴事件
通常在自己的APP里的密码框,验证码框需要屏蔽复制,粘贴,怎么办呢? 有三种方法: 1 hook 此方法是最完全的,但由于hook是全局的,容易影响到其它代码. 2 子类化文本框, 重写OnPaste ...
- ORA-16038: log 3 sequence# 103 cannot be archived
[size=large]今天在自己机器做了个实验,插入10万条,由于空间少,重启数据库时出现: [size=x-large]SQL> startup ORACLE instance starte ...
- maven中的snapshot来源与注意事项
maven中的snapshot来源与注意事项 (2012-04-23 15:37:48) 转载▼ 标签: 杂谈 分类: java maven的依赖管理是基于版本管理的,在maven2之后,把版本管理细 ...