在Mac OS X上使用DYLD_LIBRARY_PATH可以吗? 而且,什么是dynamic库searchalgorithm呢?

我读了一些文章,不鼓励使用DYLD_LIBRARY_PATH,因为dynamic库的path应该使用-install_name,@rpath和@loader_path来修复。

在制作一个在Linux和Mac OS X上运行的程序,Mac OS X的DYLD_LIBRARY_PATH正是Linux的LD_LIBRARY_PATH。 而且,我们可以共享(几乎)相同的没有-install_name和@rpath的make文件。

  • 可以在Mac OS X上使用DYLD_LIBRARY_PATH吗?
  • 当二进制找不到dynamic库时,什么是使用Mac OS X的dynamic库searchalgorithm? 当前目录 – > DYLD_LIBRARY_PATH目录…?

如您DYLD_LIBRARY_PATHDYLD_LIBRARY_PATH行为与其他* nix上的LD_LIBRARY_PATH类似。 但是,您应该查看另一个环境variables,称为DYLD_FALLBACK_LIBRARY_PATH

一般来说,这些(都在osx和linux上)仅供开发使用,因为当您使用不具有相同符号表的库进行覆盖时,它们可能会导致符号查找错误。 一个很好的例子就是当你尝试用自定义安装来覆盖VecLib的默认安装(例如blapack)时。 如果设置了DYLD_LIBRARY_PATH那么这将导致链接到系统VecLib的应用程序中找不到符号,如果不是,则会导致符号找不到错误。 这是由于系统blas / lapack没有完全实现ATLAS库。

DYLD_FALLBACK_LIBRARY_PATH不会产生这些问题。

将库安装到非标准位置时, DYLD_FALLBACK_LIBRARY_PATH更加理智。 这将查找默认path中提供的库中的符号,如果在那里找不到符号,则回退到指定的path。

好处是这个过程不会导致对默认库编译的应用程序中的符号查找错误。

通常,当库被安装到非标准位置时,应指定绝对path,否定dynamic查找的模糊性。

DYLD_LIBRARY_PATH行为不像LD_LIBRARY_PATH 。 OS X dlopen文档( https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html )指定当提供绝对path时,它将首先查找位置由DYLD_LIBRARY_PATH指定:

当path包含一个斜线但不是一个框架path(即一个完整的path或一个dylib的部分path)时,dlopen()search下列内容,直到find一个兼容的Mach-O文件:$ DYLD_LIBRARY_PATH ,然后提供的path(使用相对path的当前工作目录),然后$ DYLD_FALLBACK_LIBRARY_PATH(从path的叶名称)。

换句话说,如果您将DYLD_LIBRARY_PATH设置为/Hello ,则以下两个dlopen调用:

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

都将parsing为/Hello/libfoo.so 。 这是非常直观的,并代表一个安全漏洞。 使用dlopen软件无法保证加载正确的库(也许在自己的环境中重写DYLD_LIBRARY_PATH ?)

有关dynamic链接编辑器的环境variables以及它们如何影响searchdynamic库的文档,请参阅man dyld

DYLD_LIBRARY_PATH

这是一个冒号分隔的包含库的目录列表。 dynamic链接器在search库的默认位置之前search这些目录。 它允许您testing现有库的新版本。

对于程序使用的每个库,dynamic链接程序依次在DYLD_LIBRARY_PATH的每个目录中查找它。 如果仍找不到该库,则依次searchDYLD_FALLBACK_FRAMEWORK_PATH和DYLD_FALLBACK_LIBRARY_PATH。

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

DYLD_FALLBACK_LIBRARY_PATH

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

DYLD_VERSIONED_LIBRARY_PATH

这是一个以冒号分隔的包含潜在覆盖库的目录列表。 dynamic链接器search这些目录中的dynamic库。 对于每个库,发现dyld查看其LC_ID_DYLIB并获取current_version和install名称。 Dyld然后在安装名称path中查找库。 只要具有该安装名称的dylib是必需的,将在该过程中使用具有较大current_version值的那一个。 这与DYLD_LIBRARY_PATH类似,除了不是总是重写,它只覆盖所提供的库是较新的。