可执行文件的静态链接和动态链接
静态链接会将需要的库函数在编译时一并包含, 所以体积会比较大.

使用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的更多相关文章

  1. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  2. Linux中的软硬链接

    说到Linux中的软硬链接,就必须谈一下Linux的文件系统的组成的重要部分iNode和block. 首先是iNode,先用一张图了解一下iNode在Linux文件系统中的地位: Linux中的文件的 ...

  3. 【linux排错】"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: lcw: error : cannot open shared object file: No such file ...

  4. linux动态链接库和静态链接库

    Linux下静态链接库与动态链接库的区别 引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件 (object file)与牵涉到的函数库(librar ...

  5. GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件

    我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go ...

  6. linux脚本: makefile以及链接库

    Linux makefile 教程 非常详细,且易懂 http://blog.csdn.net/liang13664759/article/details/1771246 //sort.c #incl ...

  7. 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 ...

  8. Linux中使用京东代码库JDCode创建私有Git仓库

    国外Git经常被墙,所以目光转向国内.目前,云存储真的是很热,有很多公司在做. 看了一下,CSDN,开源中国,淘宝,京东,Gitcafe都在搞.淘宝只支持SVN. JD号称提供1G免费空间,而且支持私 ...

  9. linux中的硬链接和软链接是什么

    Linux 文件系统最重要的特点之一是它的文件链接.链接是对文件的引用,这样您可以让文件在文件系统中多处被看到.不过,在 Linux 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行 ...

随机推荐

  1. 7.4 服务远程暴露 - 创建Exporter与启动netty服务端

    为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为exporter 启动netty 注册服务到zookeeper 订 ...

  2. Visual Studio 2008 安装失败(“Web 创作组件”无法安装)(转)

    今天安装VS2008时出现了问题,怎么都无法安装成功.装了好几次都在“Visual Studio Web 创作组件(Visual Studio Authoring Component)”的安装的时候失 ...

  3. 超链接a标签的href与onclick中使用javascript的区别

    onclick中javascript的区别一般没用到都没注意,但出错时才有些郁闷,看文本章解释如下: 以前一直很随意,后来看.net里的linkbutton似乎是用在<a href=" ...

  4. pdf阅读器改背景色

  5. 如何用Javascript检测到所有的IE版本

    如何用Javascript检测到所有的IE版本 function GetIEVersion() { var sAgent = window.navigator.userAgent; var Idx = ...

  6. 推荐一款jQuery ColorPicked 颜色拾取器插件

    先看实现的效果图, 本文底部有完整demo 不想看我墨迹的可以跳过了^_^. 官网地址:http://www.eyecon.ro/colorpicker/#about 代码SVN 地址:https:/ ...

  7. (纪录片)鸟瞰中国 China from Above

    简介: 类型: 纪录片官方网站: natgeotv.com/uk/china-from-above制片国家/地区: 美国语言: 英语集数: 2单集片长: 44分钟IMDb链接: tt4872012 主 ...

  8. DexHunter脱壳神器分析

    0x00 这篇文章我们分析Android脱壳神器DexHunter的源码. DexHunter作者也写了一篇介绍它的文章从Android执行时出发.打造我们的脱壳神器.DexHunter源码位于htt ...

  9. CentOS6.5安装nginx1.5.8时出现“cp: "conf/koi-win" 与"/usr/local/nginx/conf/koi-win" 为同一文件”的解决方法

    安装方法主要参考了:http://www.cnblogs.com/zhoulf/archive/2013/02/09/2909653.html这篇文章,出现“cp: "conf/koi-wi ...

  10. android studio开发的时候出现design editor is unavailable until after a successful project sync问题的解决方法

    android studio设计界面的时候,出现了报错:design editor is unavailable until after a successful project sync,导致无法编 ...