アプリ起動時に処理を割り込ませる方法

バージョンはLeopard*1。DYLD_FORCE_FLAT_NAMESPACEを使わないといけないのがアレですがまあアレです。
あと不要な手順が結構あるかも。
試すときは自己責任でお願いします。とりあえずsshとかでログインできるようにしておくと良いかも。

  1. アプリがリンクしているフレームワークを調べ、そのcurrent versionとcompatibility versionを調べる
    • otool -L Hoge.app/Contents/MacOS/Hoge
    • 仮にFuga.frameworkとする
  2. XcodeでFuga2という名前のフレームワークを新規作成する。
    • 追加>既存のフレームワークでFuga.frameworkを追加
    • Fuga2Dummyクラスを追加
      • 一応Fuga.frameworkのクラスを参照しておく(仮にFugaViewクラスとする)
      • @class FugaView;
      • 適当にメソッドを追加して[FugaView class]などと書いておく
    • インスペクタのビルドのリンクの現在のライブラリのバージョンと互換バージョンと変更(Fuga.frameworkに合わせる)
    • ビルドして/System/Library/Frameworksと/Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/にインストール
  3. XcodeでFugaという名前のフレームワークを新規作成する
    • 追加>既存のフレームワークで(本物の)Fuga.frameworkと上で作ったFuga2.frameworkを追加
    • FugaDummyクラスを追加
    • FugaDummyクラスに+(void)loadメソッドを作成し、適当に処理(NSLog(@"[FugaDummy] hello!");など)を書く
    • Info.plistのNSPrincipalClassでFugaDummyを指定
    • インスペクタのビルドのリンクの現在のライブラリのバージョンと互換バージョンと変更(本物のFuga.frameworkに合わせる)
  4. /System/Library/Frameworks/の下をごちょごちょする
    • さっき入れたFuga2.frameworkを削除
    • 本物のFuga.frameworkの中身をFuga2.frameworkにコピー

mkdir Fuga2.framework
(cd Fuga.framework;tar cf - .)|(cd Fuga2.framework;tar xvf -)
mv Fuga2.framework/Versions/Current/Fuga{,2}
rm Fuga2.framework/Fuga
ln -s Versions/Current/Fuga2 Fuga2.framework

    • 本物のFuga.frameworkの中身をバックアップ

mv Fuga.framework{,.bak}

    • 上で作ったダミーのFuga.frameworkを/System/Library/Frameworks/下にインストール
  1. 環境変数にDYLD_FORCE_FLAT_NAMESPACE=YESを追加
  2. Hoge.appを起動
    • Hoge.app/Contents/MacOS/Hoge
    • →FugaDummyに書いた処理が実行される

追記

Mach-oファイルにバイナリパッチ当てて直接LC追加すればtwo-level namespaceのままでも出来そうな気も。

もっとも元のアプリがプラグイン機構持つのが一番いいと思う。折角ローダブルバンドルを気軽に作れる環境なんだし。

*1:Snow Leopardでも出来ればイイナ