2 つのサードパーティ ライブラリがあります。1 つには armv6 用のビルドがあり、もう 1 つには armv7 用のビルドがあります。iOS エンタープライズ アプリケーションで両方を使用する必要があります。armv6 ライブラリ ベンダーに armv7 バージョンを提供するように依頼しましたが、提供できませんでした。(注:私はすでに答えを得ており、それを提供します。他の誰かがコメントでこれを尋ねましたが、答える余地がなかったので、私は独自の質問を作成し、私の答えを提供します。)
1 に答える
答えは、armv6ライブラリをハックしてarmv7ライブラリだと思い込ませることです。これにより、ベンダーがライブラリを提供するまで実行できます。これが機能する理由は、arm仕様では、すべてのarmアーキテクチャが以前のアーキテクチャで生成されたコードを実行できる必要があるためです。したがって、armv6ライブラリがリンカーにarmv7であると通知した場合でも、プロセッサはコードを実行できるはずです。もちろん、あなたは他の方法で行くことはできません。両方のライブラリでotool-hを使用して、cputypeとcpusubtypeを確認します。私のライブラリでは、両方のcputypeで12、サブタイプで6と9であり、armv6とarmv7を示しています。16進エディターを使用して、ビッグ/リトルエンディアンが原因で反転したマーカーMH_MAGIC(0xfeedface)である16進文字列0xcefaedfeを探します。
その後、0xCだけの単語があります。これがcputypeの12です。次は0x6の単語です。すべての場合で0x9に変更します。これで、ldはライブラリがarmv7であると見なし、それに応じて動作します。
armv6がいくつかのthumbsライブラリルーチンにリンクしている可能性があるため、おそらく完了していません。リンクエラーが発生した場合(switch8とswitch16でいくつか発生しました)、それらを含むDarwinコードを見つける必要があります。Webでファイルlib1funcs.asmを探します。これにはおそらく不足している機能があります。それらはおそらく条件付きであるため、#ifdefsを調整し、コンパイルされていることを確認してください。このファイルは最後にいくつかのインクルードを開こうとしますが、それらは最後にあるので何にも影響を与えないので、コメントアウトしてください。
はい、それは途方もないハックですが、それはあなたを稼働させます。改訂されたライブラリを入手した場合は、それをドロップするだけです。コードを変更する必要はありません。それがあなたのために働くならば、あなたはまだアップルのコードを使っています、そしてそれはあなたがarmv6だけであったならばあなたが走っているのと同じコードでしょう。