2017-07-19 10 views
0

私は現在Mac上のMach-O実行可能ファイルで作業していますが、ちょうど私の質問が出てきました。単一のFat Mach-O実行ファイルに複数の目的がありますか?例えば。Fat Mach-O実行可能な多目的?

私は太っヘッダーが2つの実行可能ファイルを指定すると、単一のMach-O実行可能ファイルを持つことができます:

実行1:この実行は、そのコードは外部アプリケーションにロードできるようにすること、動的ライブラリである可能性があります。

実行2:この実行可能ファイルは、それが、独立して端子を介して、またはアプリケーションとして起動することを可能にする実行可能とすることができます。

ただ1つのMach-Oバイナリファイル内に完全に異なる機能を持つ2つの実行可能ファイルを持つことができますか?

答えて

2

はい、可能ですが、ほとんど役に立ちません。私はなぜに入る前に、ここでは1を作成する方法は次のとおりです。

#ifdef __LP64__ 
int main(void) 
#else 
int derp(void) 
#endif 
{ 
    return 123; 
} 

は、64ビットの実行可能ファイルとして、それをコンパイルし、32ビット共有ライブラリ:

gcc -o t t.c -Wall 
gcc -m32 -o t.dylib -Wall t.c -shared 

は、このCファイルを取ります

し、それらを一緒にスマッシュ:

lipo -create -output t.fat t t.dylib 

、なぜという有用ではないことになっていますか?
アーキテクチャごとに1つのバイナリに制限されているため、どのスライスを使用するかをほとんど制御できません。

  • i386の
  • x86_64の
  • x86_64h
  • ARMv6の
  • armv6m
  • のARMv7
  • armv7s:
    理論的には、あなたは同じファットバイナリ内のすべてのこれらのアーキテクチャ用のスライスを持つことができます
  • armv7k
  • armv7m
  • arm64

だから実行、dylib、リンカーおよび1つのファットバイナリにカーネル拡張を破ることができますが、あなたは苦労そこから有益なものを取得する必要があるだろう。
最大の問題は、OSがどのスライスを読み込むかを選択することです。実行ファイルの場合は、実行中のプロセッサに常に最も近いものになります。 dylib、dylinkers、kextsの場合、プロセスが32ビットまたは64ビットであるかどうかが最初に判断されますが、その区別が行われると、そこにあるCPUのスライスに最も近いスライスも得られます能力。

Mac OS X 10.5に戻ってみると、64ビットのバイナリを32ビットのkextにバンドルして読み込んで読み込めます。しかし、その外で私はこれのユースケースを考えることができません。

関連する問題