重新定位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/,可以使用 安装名称工具实用程序

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用Eclipse Helios for Web项目   java指定行。作为编译器设置的分隔符?   osm映射中带有osmdroid的java标记   java Android ClassNotFoundException在路径:DexPathList上未找到类   java从j2me调用GWT方法   更新到java 8后的aspectj问题   如何仅从根元素java,com提取文本内容。滴虫软件。是的。html   安卓公司。谷歌。火基。数据库DatabaseException:未能转换java类型的值。将字符串改为长字符串   从java中的方法返回arraylist变量   java如果将引用重新分配给同步块内的锁对象,会是什么?   java下载。使用spring mvc的资源文件中的xlsx文件   java Eclipse提供了什么工具来运行Eclipse中未包含的程序?   spring boot Java泛型如何读取传递给泛型方法的类型上的字段或调用方法   Javacard中的javaecdsa签名