macOS 中的递归 RPATH
Recursive RPATH in macOS
一个框架的目录结构是这样的:
fw.framework
Versions
A
fw
Libraries
a.dylib
b.dylib
Current -> A
Libraries -> Versions/Current/Libraries
fw -> Versions/Current/fw
依赖关系:
fw
链接到 a.dylib
a.dylib
链接到 b.dylib
a.dylib
和 b.dylib
具有 安装名称 @rpath/a.dylib
和 @rpath/b.dylib
.
fw
的RPATH设置为@loader_path/Libraries
,这样可以找到a.dylib
.
但是a.dylib
的RPATH设置为@loader_path
,因为它的依赖b.dylib
在同一个目录下
这行得通吗?当递归链接 b.dylib
时,链接器是否会使用 a.dylib
的 RPATH(而不是 fw
中的一个)
并且 a.dylib
的 RPATH 中的 @loader_path
会引用 a.dylib
的目录,而不是 [=11= 的目录]?
是的,你是对的。
如果你使用 otool -l <dylib>
,你会发现(在我的例子中):
Load command 22
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
@loader_path
将被解析为包含 <dylib>
的文件夹路径,因此每个 dylib 都会有自己的 @loader_path
.
同上,LC_RPATH
表示@rpath_path
在不同的dylib中会有不同的路径,不会被继承。
因此,当您加载 fw
时,fw
的 @loader_path
是它的 dirname,加载 a.dylib
,[= a.dylib
的 12=] 是它的 dirname.
一个框架的目录结构是这样的:
fw.framework
Versions
A
fw
Libraries
a.dylib
b.dylib
Current -> A
Libraries -> Versions/Current/Libraries
fw -> Versions/Current/fw
依赖关系:
fw
链接到a.dylib
a.dylib
链接到b.dylib
a.dylib
和 b.dylib
具有 安装名称 @rpath/a.dylib
和 @rpath/b.dylib
.
fw
的RPATH设置为@loader_path/Libraries
,这样可以找到a.dylib
.
但是a.dylib
的RPATH设置为@loader_path
,因为它的依赖b.dylib
在同一个目录下
这行得通吗?当递归链接 b.dylib
时,链接器是否会使用 a.dylib
的 RPATH(而不是 fw
中的一个)
并且 a.dylib
的 RPATH 中的 @loader_path
会引用 a.dylib
的目录,而不是 [=11= 的目录]?
是的,你是对的。
如果你使用 otool -l <dylib>
,你会发现(在我的例子中):
Load command 22
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
@loader_path
将被解析为包含 <dylib>
的文件夹路径,因此每个 dylib 都会有自己的 @loader_path
.
同上,LC_RPATH
表示@rpath_path
在不同的dylib中会有不同的路径,不会被继承。
因此,当您加载 fw
时,fw
的 @loader_path
是它的 dirname,加载 a.dylib
,[= a.dylib
的 12=] 是它的 dirname.