2011-11-18 3 views
10

Mac OS Xでは、DYLD形式のバイナリ実行可能ファイルには、ライブラリのロードシステムにファイルの内容の処理方法を指示する「ローダコマンド」が含まれています。特に、loaderコマンドは、依存するライブラリを検索するシステムに指示します。ldが明示的にサポートしていないDYLDローダーコマンドをインストールするにはどうすればよいですか?

"otool -l/path/to/your"を実行すると、システム上のバイナリのローダコマンドの完全なリストが表示されます/ app "

一般に、これらのローダーコマンドは、プロジェクトのコンパイルのリンクフェーズで "ld"ツールによって設定されます。

私の質問は、(明らかに)ldでサポートされていない宣言された型のローダコマンドを追加するために何をする必要がありますか?

特に、私はLC_DYLD_ENVIRONMENTローダーcommmandを利用したいと思います。これはローダーコマンドテーブルの文字列を環境変数設定として読み込んで評価するバイナリを指定するのに使用できます実行可能ファイル。

これを容易にするldの引数はありません。 "-sectcreate"のようなものが、ローダーコマンドの内容に特に追加するものは、私が後にしているものです。

Mac OS Xの標準アプリケーションの少なくとも1つがSafariを使用しているため、これが可能です。しかし、私はバイナリのポストリンクマッサージによってこれを達成するかどうか、カスタムローダーコマンドをビルドしてチェーンする方法を知っているカスタムバージョンのldを使用しているのか、あるいはそれらが悪用されているのかどうかはわかりません私が把握できなかったldコマンドの一般的な機能です。

答えて

14

「-dyld_env DYLD_FRAMEWORK_PATH = /」のように、-dyld_envを使用できるようです。これはmanページには書かれていませんが、ld64のOptions.cppにあり、Changelogファイルに記載されています。 Xcodeからやってみようとしているなら、おそらく "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /"のようにする必要があります。

dyldのdyld.cppを見ると、DYLD_で始まり_PATHで終わる環境変数しか使用できないことがわかります。

+0

素晴らしい!ありがとう。また、LC_DYLD_ENVIRONMENTは実際にはDYLDの読み込みに影響を与えるものだけを任意の環境変数に定義させるわけではないことに注意してくれたTwitter経由のフィードバックもあります。その程度まで、以下のNedからのLSE環境の勧告は、私の直ちに必要なものに適していますが、あなたの答えは質問の要点にとって最も適切な参考資料です。 – danielpunkass

8

実行可能ファイルが標準のOS Xアプリケーションバンドル(ユーザーが起動できる.app)の一部として構成されている場合、アプリケーション固有の環境変数を指定する従来の方法は、LSEnvironmentキー。詳細については、hereを参照してください。

+0

ありがとう、Ned!これは問題の正式な答えではありませんが、DYLDローダーコマンド機能の現在の興味の核心になっています。私はLSEnvironmentを説明された目的のために使用します! – danielpunkass

関連する問題