コードの機能とファイル形式を損なうことなくELFエンディアンを変更することはできますか?ビッグエンディアンELF実行ファイルをリトルエンディアンエンディアンに変換しますか?
私の目標は、リトルエンディアンマシンでビッグエンディアンのARM実行ファイルを実行することです。
(ヘッダーやその他の理由により)バイトを交換するだけではない場合は、必要な手順は何ですか?
コードの機能とファイル形式を損なうことなくELFエンディアンを変更することはできますか?ビッグエンディアンELF実行ファイルをリトルエンディアンエンディアンに変換しますか?
私の目標は、リトルエンディアンマシンでビッグエンディアンのARM実行ファイルを実行することです。
(ヘッダーやその他の理由により)バイトを交換するだけではない場合は、必要な手順は何ですか?
いいえエンディアンは、ファイル形式ではなく、コード内で使用されるABIであり、マシン命令とデータ構造の両方の形で使用されます。
ARM BE/LEは、その時点でのx86とARMの同じ相違点であり、「変換」できません。
その特別な違いのいくつかを指摘できますか? – Reflection
コード自体は、エンディアンを使用することができます(たとえば、4バイトのintの最初のバイトを読み取り、それが下位バイトであると仮定します)。指示を適切に翻訳しても、ほとんどすべてのプログラムが壊れます。 – BitBank
確かに。同様に、ELFはアクセスするデータ構造のセマンティクスをエンコードしないので、翻訳ソフトウェアがアクセスしている構造のどの部分にいるのかを知ることは不可能であり、構造内のフィールドの順序はエンディアンに定義されている可能性があります。 –
あまりにも曖昧で、2つのアームビッグエンディアンモードがあります。あなたが搭載しているコアと、より重要なのはチップ/周辺機器に適していると仮定することができます。このバイナリをロードして実行する前にエンディアンモードを切り替えることもできますが、このベアメタルまたはオペレーティングシステムの環境によっても異なります。ベアメタルには非常にスリムなチャンスがあります。 –
be-32古い方法では32ビットのものがスワップされず、バイトとハーフワードがスワップされていました。だから、バイナリのどの部分(単語単位で)が単語としてアクセスされているのかを知り、他のすべてを入れ替える必要があります。バイトアクセスは変更されませんが、ワードとハーフワードのデータアクセスは実行されませんので、データワードまたはハーフワードとしてアクセスされるバイナリのバイトを分離してスワップする必要があります。短い答え、スワップが効きません。バイナリが動作するチップ上にあると仮定してプロセッサを適切なモードに切り替える必要があります(perhipheralsなど) –