• LD_PRELOAD & LD_LIBRARY_PATH 动态库路径


    参考:http://www.cnblogs.com/waterlin/archive/2011/07/14/2106056.html

    143上的glibc较低,同学又不能进行升级(造成全局影响),所以使用了LD_LIBRARY_PATH,将179上的/lib,然后在.bashrc中添加

    export LD_LIBRARY_PATH=path/lib:path/lib/x86_64-linxu-gnu

    参考自:

    http://blog.csdn.net/haoel/article/details/1602108

    http://skatings.blogbus.com/logs/50437681.html

    LD_PRELOAD 是这样的一个环境变量:它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。该功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们 可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。

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

    那么:

    如果需要用到的共享库在非标准路径,ld.so怎么找到这些库呢?

    方法一:

    链接时候通过 -R选项(或 -rpath)指定 run-time path.

    方法二:

    使用LD_LIBRARY_PATH来处理非标准路径的共享库。ld.so加载共享库的时候,也会查找这个变量锁设置的路径。

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
    export LD_LIBRARY_PATH

    方法三:

    (1)将非标准库路径加入  /etc/ld.so.conf;/etc/ld.so.conf文件内存放着可被Linux共享的动态链接库所在目录的名字(系统目录/lib, /usr/lib除外)

    (2)运行ldconfig跟新 /etc/ld.so.cache;ld.so加载共享库的时候,会从ld.so.cache查找。

    方法四:

    (1)将所生成的动态库,放入  /lib 或  /usr/lib  目录下;

    (2)调用ldconfig   否则找不到library  (ldconfig 跟新 ld.so.cache).

    动态库的搜索路径搜索的先后顺序是:
        编译目标代码时指定的动态库搜索路径
        环境变量LD_LIBRARY_PATH指定的动态库搜索路径
        配置文件/etc/ld.so.conf中指定的动态库搜索路径
        默认的动态库搜索路径/lib
        默认的动态库搜索路径/usr/lib

    附:

    参考自:http://www.ituring.com.cn/article/22101

    LD_LIBRARY_PATH是一个环境变量,它的作用是为ld.so在运行时提供一个额外的搜索路径列表。

    出于安全原因,对于已设置setuid或setgid的可执行文件,LD_LIBRARY_PATH被完全忽略。

    LD_LIBARY_PATH的需求有很多:

    1、兼容性测试
    2、将动态库放置它处,做临时测试

    LD_LIBRARY_PATH不仅影响程序的加载,而且在链接阶段也会被搜索,顺序位于-L所指定的目录之后(没有-L选项也会被搜索).

    好的使用LD_LIBRARY_PATH的例子应该是:

    1、升级共享库时,替换之前先测试一下
    2、类似的,升级后的某个程序可能依赖于一些动态链接库,如果你将某个链接库替换了,程序可能就无法工作了。这时候,你可以使用LD_LIBRARY_PATH指向存有备份的一个目录,然后,你可以没有顾忌地替换系统版本了。万一出错,拷贝回去就是了。

    规范的LD_LIBRARY_PATH使用方法:

    1、绝不要设置全局的LD_LIBRARY_PATH
    2、如果你一定要发布(ship)一个依赖于标准库的程序,而且要把它安装到非标准位置,按下面方法之一实施:
        (1)发布二进制.o文件,在安装过程中使用正确的已安装的库来重新链接。
        (2)发布可执行文件时,嵌入一个很长的虚假运行时库路径,在安装过程中,使用二进制编辑器将其替换为正确的库路径。
        (3)如果你必须使用LD_LIBRARY_PATH,将其封装起来(如在局部的脚本中使用),而不至于影响其它程序。

    附:

    参考:http://www.cnblogs.com/openix/admin/EditPosts.aspx?postid=2431791

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

  • 相关阅读:
    Beginning UICollectionView In iOS 6: Part 2/2
    Intermediate Debugging with Xcode 4.5
    Xcode4: Running Application Tests From The Command Line in iOS
    Mac 在open with列表中清除重复应用程序
    Beginning UICollectionView In iOS 6: Part 1/2
    Xcode Apple MachO Linker warning
    Running Xcode 4 unit tests from the command line
    25 iOS App Performance Tips & Tricks
    Introduction to InApp Purchases in iOS 6 Tutorial
    iPhone Development 101: Cocoa: Notifications
  • 原文地址:https://www.cnblogs.com/openix/p/3521166.html
Copyright © 2020-2023  润新知