2017-11-16 31 views
1

異なるiOSアーキテクチャのバイナリファイルは同じコード全体であるか、または異なる可能性があります。iosアーキテクチャのバージョン - 同じコード

これらのバイナリの特定のもの、たとえばPIE、ARC、またはmemcpyなどの文字列をチェックする場合は、同じものについて両方の薄いバイナリをチェックする必要がありますか、まったく異なるメモリアドレス?

例えばa fat binary consisting of armv7 and arm64, if the armv7 binary has PIE enabled, so will the arm64?

if the armv7 binary uses strcpy, the arm64 binary will also use strcpy?

例をさらに明確化のために:両方のバイナリが同じ所見を含む、TLDRに以下のように意味?同じコードで、ちょうどアーチごとに違うようにコンパイルされています。

armv7 
0x001e7e44 665 _memcpy 
0x001e7ea4 770 _strlen 
0x001e7eac 772 _strncpy 
0x001e85b4 665 _memcpy 

arm64 
0x00000001001be7f0 645 _memcpy 
0x00000001001be904 746 _strlen 
0x00000001001be91c 748 _strncpy 
0x0000000100220f18 645 _memcpy 

TLDR; 2つのiOSバイナリが同じコードであり、アーキテクチャに応じて異なる方法でコンパイルされていますか?

答えて

0

Fatバイナリには、何も共通する必要のない複数の独立したMach-Oファイルが含まれています。

ただ1つのプラットフォーム用のバイナリをコンパイルするとき、その事実はほとんど分かりませんが、クロスプラットフォームバイナリ(いくつかの研究ツールがMacOSとjailbroken iDevicesの両方で動作するのが一般的です)を構築するとき、それは手動:

gcc -o program.macos program.c 
xcrun -sdk iphoneos gcc -arch armv7 -arch arm64 -o program.ios program.c 
lipo -create -output program program.macos program.ios 

は今、脂肪マッハ-Oの通常複数のスライスは、異なるアーキテクチャ用にコンパイルされ、同じコードベースが含まれている - 結局のところ、それが意図された使用です。しかし、これは必須ではありません。staple entirely different object files together(免責事項:私の回答)。しかし、私がその投稿に書いたように、あなたが選択されたスライスを制御することはできないので、これを行うことは非常に限定された使い方です。

微妙な違いはかなり共通しています。このようなCコード:私は前者に簡単輸入を許可io_*関数は、32ビットにエクスポートではなく64ビットにしている(正式に禁止)IOKitのフレームワークの使用を含む知る

void some_function(void) 
{ 
#if __LP64__ 
    // do something 
#else 
    // do something else 
#endif 
} 

例しかし、後者には自家製のdlsym()スタイルスキャンコードが必要でした。結論として

は通常、同じコードベースからコンパイル異なるマッハ-Oのスライスはありますか? はい
すべきですか? はい
これはどのように保証されていますか? いいえ

+0

でも、それでも一緒にステープル留めできるのですが、通常はそうですか?私が見た上で私の例を調べたすべてのiOSアプリ、パイ、スタックスマッシュ、アークなど、両方のMAch-Oファイルは同じです...私はこれまでにどんな違いがあるのでしょうか、私はまだarmv7とarm64? – jerrythebum

+0

私たちはまた、MacOSアプリケーションではなく、ここでiOSアプリケーションについてのみ話しています – jerrythebum

+0

まあ、正確に何をしたいですか?結局のところ、Mach-Oの内容に関する何かは、著者まで100%です。 – Siguza

関連する問題