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 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行 ...
随机推荐
- (八十七)AutoLayout的简单介绍与实例
AutoLayout是继AutoResizing之后的一种自己主动布局方法.攻克了AutoResizing无法处理控件间相互关系的问题. AutoLayout在storyboard中通过底部工具条设置 ...
- Java NIO和IO的区别(转)
原文链接:Java NIO和IO的区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. 复制代码代码如下: IO NIO面向流 ...
- tmux 终端分屏利器使用
介绍 Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话. 不仅如此,你还可以通过 Tmux 使终端会话运行于后台或是按需接入.断开会话,这个功能非常实用. 很好的工具,记录一下,以后要常用. ...
- [leetcode]Multiply Strings @ Python
原题地址:https://oj.leetcode.com/problems/multiply-strings/ 题意: Given two numbers represented as strings ...
- 使用 CSS 接收用户的点击事情并对相关节点进行操作
问题背景:使用纯 CSS 方案,实现导航栏tab切换 实现 Tab 切换的难点在于如何使用 CSS 接收到用户的点击事情并对相关的节点进行操作.即是: 如何接收点击事件 如何操作相关DOM 下面看看如 ...
- pThreads线程(三) 线程同步--条件变量
条件变量(Condition Variables) 参考资料:http://game-lab.org/posts/posix-thread-cn/#5.1 条件变量是什么? 条件变量为我们提供了另一种 ...
- Linux获取进程执行时间
1.前言 测试一个程序的执行时间,时间包括用户CPU时间.系统CPU时间.时钟时间.之前获取之前时间都是在程序的main函数用time函数实现,这个只能粗略的计算程序的执行时间,不能准确的获取其 ...
- RAMPS1.4 3d打印控制板接线与测试1
1.需要下载的软件 1.1 固件上传工具--Arduino IDE 这是上传固件的必备工具,有了这个软件让上传固件变的容易很多,插上USB,就可以轻松上传. 下载地址:windows版本:http:/ ...
- 从Linux服务器下载网站文件
最近公司迁来一个新客户,该客户的网站是别的网络服务商做的,放在linux主机上,因为客户跟之前的网络服务商合作的不愉快 所以就把网站迁到我们公司,经理让我把网站文件和数据库download下来并在我们 ...
- OpenNebula学习第四节之磁盘镜像的制作
一.准备工作 需要准备一个Ubuntu16.04的ISO文件上传至服务器,如下图所示 二.操作步骤 2.1:创建操作目录 创建一个/var/tmp/cloud_image目录,把Ubuntu16.04 ...