を使用して実行可能ファイルのrpathを変更したいのですが、現在rpathinstall_name_tool
が何であるかがわかりません。古いrpathと新しいrpathの両方をコマンドラインで指定する必要があります。macOSで実行可能ファイルのrpathを出力するためにどのコマンドを使用できますか?install_name_tool
5 に答える
まず、実行可能ファイルには単一のrpath
エントリではなく、1 つ以上のエントリの配列が含まれていることを理解してください。
次に、 を使用otool
して画像のrpath
エントリを一覧表示できます。を使用するotool -l
と、次のような出力が得られます。その最後にrpath
エントリがあります。
Load command 34
cmd LC_LOAD_DYLIB
cmdsize 88
name /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1038.32.0
compatibility version 45.0.0
Load command 35
cmd LC_RPATH
cmdsize 40
path @loader_path/../Frameworks (offset 12)
コマンドを探し、エントリLC_RPATH
の下のパスをメモします。path
編集:内容について@loader_path
:フレームワークのロードを行いたいMach-Oオブジェクトを参照する一般的かつ動的な方法です。
これはかなり不自然な例ですが、要点を理解する必要があると思います。MyApp.app
フレームワークを使用するアプリがあるとしますMyFramework.framework
。また、適切に機能するためには、アプリが /Applications にインストールされ、それ以外の場所にインストールされていないことが必要です。したがって、上記のアプリとフレームワークの構造は次のようになります。
/Applications/MyApp.app/Contents/MacOS/MyApp
(実行可能)
/Applications/MyApp.app/Contents/Frameworks/MyFramework.framework/MyFramework
(Mach-O dylib)
実行可能ファイルでotool -L
実行すると (大文字の L に注意してください)、MyFramework に関して次のように表示されます。
@rpath/MyFramework.framework/Versions/A/MyFramework
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
/usr/lib/libobjc.A.dylib
/usr/lib/libSystem.B.dylib
....
MyFramework.framework は@rpath
インストール名/パスを使用するため、実行時に置き換えられる実行時検索パス エントリが必要になることに注意してください@rpath
。これで、次の 1 つの rpath エントリを持つことができます。
/Applications/MyApp.app/Contents/Frameworks
それは機能し、実行時に 2 つの部分がまとめられます。
/Applications/MyApp.app/Contents/Frameworks
+ /MyFramework.framework/Versions/A/MyFramework
==
/Applications/MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/MyFramework
明らかに、このようなパスのハードコーディングは理想的ではありません。アプリを別のフォルダーに移動したり、アプリ自体の名前を変更したりするだけでは、リンクが失敗する可能性があります。
@loader_path
ファイルシステム上に存在する可能性のあるアプリの実行可能ファイルを動的に参照する単純な方法です。この特定のケースでは、実行時に、実行中の実行可能ファイルへのパスが入力されます: /Applications/MyApp.app/Contents/MacOS/MyApp
. 次に、MyFramework.framework を見つけるには、ディレクトリを上ってFrameworks
.
otool コマンドを使用するだけです
otool -l <my executable>
rpath フィールドを出力します。長いスクリプトは必要ありません。