在阅读了Justin提供的链接后,我成功地使用了@executable_path
。 为了改变我的校正安装——名称指我可起诉的同一继承人。
@executable_path Absolute paths are annoying. Sometimes you want to embed a framework into an application instead of having to install
the framework into /Library or a similar location.
The Mac s solution to this is @executable_path. This is a magic token
that, when placed at the beginning of a library s install name, gets
expanded to the path of the executable that s loading it, minus the
last component. For example, let s say that Bar.app links against
Foo.framework. If Bar.app is installed in /Applications,
@executable_path will expand to /Applications/Bar.app/Contents/MacOS.
If you intend to embed the framework in Contents/Frameworks, then you
can just set Foo.framework s install name to
@executable_path/../Frameworks/Foo.framework/Versions/A/Foo. The
dynamic linker will expand that to
/Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo
and will find the framework there.
rel=“noreferer” http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html。
我要举一个例子。
Let s say I have the following executable /opt/local/bin/convert and its dylibs are in /opt/local/lib.
I want to copy it to another dir and have it load its dylibs from the same directory as where I copied the executable.
> mkdir ~/tmp/bin
> cp /opt/local/bin/convert ~/tmp/bin
2. 找到一份可执行人员死亡清单
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
/opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
/opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
/opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...
我只关心/opt/ local/lib dir”中的校正,因此我们只从/opt中抽出dy。 我想保留所有其他不准确之处,特别是/usr/lib/libSystem。
> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F { print $1 } `
抄录可起诉的同一继承人的可执行内容。
> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;
使用<代码>install_name_tool,改变我们在以上步骤中提取的所有校正名称,代之以将@executable_path
预先贴在校正名称。 这样,动态联系人就能够找到与可起诉人所在地相同的目录中的校正。
> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;
Confirm that the install names have been changed and that libSystem is still pointing to /usr/lib/libSystem.
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
@executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
@executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
@executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
@executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
@executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
@executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
@executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
@executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...