83

を使用して実行可能ファイルのrpathを変更したいのですが、現在rpathinstall_name_toolが何であるかがわかりません。古いrpathと新しいrpathの両方をコマンドラインで指定する必要があります。macOSで実行可能ファイルのrpathを出力するためにどのコマンドを使用できますか?install_name_tool

4

5 に答える 5

114

まず、実行可能ファイルには単一の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.

于 2012-09-20T22:56:18.450 に答える
-1

otool コマンドを使用するだけです

otool -l <my executable>

rpath フィールドを出力します。長いスクリプトは必要ありません。

于 2016-02-26T17:41:28.590 に答える