代码之家  ›  专栏  ›  技术社区  ›  prosseek

在Mac OS X上使用DYLD\u LIBRARY\u PATH可以吗?动态库搜索算法是什么?

  •  45
  • prosseek  · 技术社区  · 14 年前

    我读了一些不鼓励使用DYLD\u LIBRARY\u PATH的文章,因为动态库的路径应该使用-install\u name、@rpath和@loader\u PATH来修复。

    3 回复  |  直到 14 年前
        1
  •  80
  •   ObscureRobot    13 年前

    正如你所说, DYLD_LIBRARY_PATH 表现得像 LD_LIBRARY_PATH 另一方面是否定的。但是,您应该查看另一个名为 DYLD_FALLBACK_LIBRARY_PATH .

    如果未设置,则设置为相反(自定义应用程序中的符号查找错误)。这是因为系统blas/lapack不是ATLAS libs的完全实现。

    动态\u回退\u库\u路径

    将库安装到非标准位置时,

    这样做的好处是,在根据默认库编译的应用程序中,此过程不会导致符号查找错误。

        2
  •  6
  •   Sander Mertens    8 年前

    DYLD_LIBRARY_PATH 不会表现得像 LD_LIBRARY_PATH dlopen 文件( https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html )指定在提供绝对路径时,它将首先查找由指定的位置

    dlopen()搜索以下内容,直到找到一个兼容的Mach-O文件:$DYLD\u LIBRARY\u PATH(带leaf 名称),然后是提供的路径(使用当前工作目录作为相对路径),然后 $DYLD\u FALLBACK\u LIBRARY\u PATH(路径中的叶名称)。

    动态库路径 /Hello ,以下两个 dlopen公司

    dlopen("/Hello/libfoo.so", RTLD_NOW);
    dlopen("/World/libfoo.so", RTLD_NOW);
    

    双方都会决心 /Hello/libfoo.so . 这是非常违反直觉的,并代表了一个安全漏洞。软件使用 dlopen公司 无法保证它正在加载正确的库(可能是重写 在自己的环境中?)

        3
  •  5
  •   Doug Richardson    9 年前

    有关动态链接编辑器的环境变量及其如何影响动态库搜索的文档, man dyld .

    动态库路径

    对于程序使用的每个库,动态链接器依次在DYLD\u library\u PATH的每个目录中查找它。如果仍然找不到库,则依次搜索DYLD\u FALLBACK\u FRAMEWORK\u PATH和DYLD\u FALLBACK\u library\u PATH。

    使用-L选项选择otool(1)。发现可执行文件链接的框架和共享库

    动态\u回退\u库\u路径

    这是包含库的目录的冒号分隔列表。它用作在安装路径中找不到的库的默认位置。默认情况下,它设置为$(HOME)/lib:/usr/local/lib:/lib:/usr/lib。

    动态版本库路径

    这是一个以冒号分隔的目录列表,其中包含潜在的重写库。动态链接器在这些目录中搜索动态库。对于找到的每个库,dyld查看其LC\u ID\u DYLIB并获取当前的\u版本和安装名称。然后,Dyld在install name路径中查找库。当需要具有该安装名称的dylib时,无论哪个版本的当前版本值较大,都将在进程中使用。这与DYLD\u LIBRARY\u PATH类似,只是没有始终覆盖,而是覆盖提供的库较新。