重新定位OSX库的实用程序
osxrelocator的Python项目详细描述
注意
这个工具最初来自gstreamer项目。已经提取出来了 在没有大脑的情况下工作,可用于多种情况。 文档也来自gstreamer的osx部署说明。 非常感谢gstreamer项目!
安装
pip install osxrelocator
用法
osxrelocator.py [options] directory old_prefix new_prefix
说明
在Darwin操作系统上,动态链接器不定位依赖项 动态库使用其叶名,但它使用完整路径 如动态库加载中所述,使它们更难重新定位 DYLD手册页的章节:
>;与许多其他操作系统不同,Darwin没有找到依赖的动态 >;库通过其叶文件名。相反,每个dylib的完整路径是 >;已使用(例如/usr/lib/libsystem.b.dylib)。但有时一条完整的道路 >;不合适;例如,可能希望二进制文件可以安装在 >;磁盘上的任何位置。
我们可以得到一个对象文件用来定位其依赖项的路径列表 使用otool的动态库:
$ otool -L /Library/Frameworks/GStreamer.framework/Commands/gst-launch-0.10 /Library/Frameworks/GStreamer.framework/Commands/gst-launch-0.10: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.43.0) /Library/Frameworks/GStreamer.framework/Versions/0.10/x86/lib/libgstreamer-0.10.0.dylib (compatibility version 31.0.0, current version 31.0.0) /Library/Frameworks/GStreamer.framework/Versions/0.10/x86/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0)
此完整路径是从动态库install name中提取的,路径是 链接器用来确定其位置的。的安装名 也可以使用otool检索库:
$ otool -D /Library/Frameworks/GStreamer.framework/Libraries/libgstreamer-0.10.dylib /Library/Frameworks/GStreamer.framework/Libraries/libgstreamer-0.10.dylib: /Library/Frameworks/GStreamer.framework/Versions/0.10/x86/lib/libgstreamer-0.10.0.dylib
任何链接到动态库gstreamer-0.10的对象文件都将使用 路径 /library/frameworks/gstreamer.framework/versions/0.10/x86/lib/libgstreamer-0.10.0.dylib 找到它。
因为只使用完整路径不会让我们安装二进制文件 在路径中的任何地方,链接器都提供了字符串替换机制, 添加三个可以用作路径前缀的变量。在运行时链接器 将用生成的前缀路径替换它们。这些变量是 @可执行路径,@loader路径和@rpath,在 dyld手册页的动态库加载部分。
出于我们的目的,我们将使用可执行路径变量 使用固定路径,指向包含主可执行文件的目录的路径: `/applications/myapp.app/contents/macos。加载程序路径变量不能是 在我们的作用域中使用,因为它将被替换为目录的路径 包含加载动态库的mach-o二进制文件,可以改变。
因此,为了重新定位sdk,我们需要替换所有路径 包含 @executable\u path/。/frameworks/gstreamer.framework/,可以使用 安装名称工具实用程序