[解決済み] macOSで実行ファイルのrpathを表示する
質問
私は
rpath
を使って実行ファイルの
install_name_tool
を使用しているのですが、その
rpath
が今現在
install_name_tool
は、古いものと新しいものの両方が必要です。
rpath
をコマンドラインで指定する必要があります。どのようなコマンドを使用すれば
rpath
を表示するには、どのようなコマンドを使用すればよいですか?
どのように解決するのですか?
まず第一に、実行ファイルには単一の
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
のエントリの下にあるパスを記録してください。
EDIT: 何に関して
@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では、"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
.
関連
-
[解決済み] macOSアップデート後、Gitが動作しない(xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
ffiのコンパイルに失敗しました *** extconf.rbに失敗しました *** 解決策
-
[解決済み】Xcodeのコマンドラインからの "Build and Archive "について
-
[解決済み] MacVimをOS Xにインストールするにはどうしたらいいですか?
-
[解決済み] Macターミナルのポップアップやアラートを出すには?アップルスクリプト?
-
[解決済み] YosemiteとValgrind
-
[解決済み] osxでシステムファイルを表示する / gitの無視を表示する
-
[解決済み] MacからParallels Windowsのローカルホストにアクセスする【非公開
-
[解決済み] OS Xで最適なSchemeやLISPの処理系は?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] grep -P が効かなくなりました。どうすれば検索を書き換えることができますか?
-
[解決済み] Mac OSXでJDK 7を使用するにはどうすればよいですか?
-
[解決済み] NSTextFieldから値を取得する
-
[解決済み] Mac OS X でファイルがどのプロセスで使用されているかを確認する
-
[解決済み] OSXアプリバンドル構築
-
[解決済み] Mac OS Xでmongodを停止するクリーンな方法は何ですか?
-
[解決済み] OS X 10.8でCaps LockキーをControlキーにリマップする方法は?重複
-
[解決済み] Macのバーチャルキーコードの一覧はどこにありますか?
-
[解決済み] Swiftでファイル/URLを一行ずつ読み込む
-
[解決済み] ディレクトリを書き込み可能にするには?[クローズド]