5

ELFヘッダーのないLinuxカーネルバイナリがあり、ブートローダーはELFヘッダーからの計算に基づいてカーネルイメージをロードします(以前のQNXカーネルイメージにはELFヘッダーがあります)が、LinuxカーネルイメージにはELFヘッダーがないためですELFヘッダーであるブートローダーは、このカーネルイメージのメモリへのロードを拒否しています。

いくつかの理由で、ブートローダーコードを変更するオプションがないため、唯一のオプションは、特定のエントリポイントを持つLinuxBINファイルにELFヘッダーを挿入することです。

それを達成する方法は何ですか?

4

1 に答える 1

16

このobjcopyコマンドは、適切なELFヘッダーでバイナリファイルをラップすることができます。たとえば、次のコマンドはバイナリファイルinput.inをi386オブジェクトファイルに変換しますoutput.o

objcopy -I binary -O elf32-i386 --binary-architecture i386 input.bin output.o

output.o_binary_input_bin_start、、_binary_input_bin_endおよびで3つの記号が定義され_binary_input_bin_sizeます。さらに、入力ファイルのそのデータは.dataセクションにあります。

ld次に、リンカースクリプトを使用して、適切なロード/仮想/物理アドレスとエントリポイントを設定する必要があります。以下は最小限のスクリプトです。

ENTRY(_start);

SECTIONS
{
    _start = 0x12000;
    . = 0x10000;
    .data : {
        *(.data)
    }
}

ただし、ブートローダーの動作、物理メモリレイアウト、カーネルの配置場所、アーキテクチャなどに応じて、大幅に変更する必要があります。微調整すると、次のように最終的なELFファイルを生成するために使用できます。

ld -m elf_i386 output.o -T binary.ld -o output.elf
于 2013-03-09T02:29:46.497 に答える