8

私はCで小さなオペレーティングシステムを書いているところです。ブートローダーを書いたので、コンパイルする単純なCファイル(「カーネル」)を取得しようとしていますgcc

int main(void) { return 0; }

次のコマンドでファイルをコンパイルします。

gcc kernel.c -o kernel.o -nostdlib -nostartfiles

リンカーを使用して、次のコマンドを使用して最終的なイメージを作成します。

ld kernel.o -o kernel.bin -T linker.ld --oformat=binary

ファイルの内容は次のlinker.ldとおりです。

セクション
{
    . = 0x7e00;

    .text ALIGN (0x00) :
    {
        *(。文章)
    }
}

(ブートローダはアドレスでイメージをロードします0x7e00。)

これは非常にうまく機能しているようldです。最初の 11 バイトに次の命令を含む 128 バイトのファイルが生成されます。

00000000 55プッシュebp
00000001 10月48日
00000002 89 E5 mov ebp, esp
00000004 B8 00 00 00 00 mov eax, 0x00000000
00000009 5D ポップ ebp
0000000A C3 ret

しかし、残りの 117 バイトが何のためにあるのかわかりません。それらを分解すると、意味のない大量のゴミが生成されるようです。追加のバイトの存在は、私が何か間違ったことをしているのだろうかと思っています。

私は心配する必要がありますか?

ファイルの 16 進ダンプ

4

2 に答える 2

12

これらは追加のセクションであり、削除も破棄もされませんでした。linker.ldファイルを次のように表示します。

SECTIONS
{
    . = 0x7e00;

    .text ALIGN (0x00) :
    {
        *(.text)
    }

    /DISCARD/ :
    {
        *(.comment)
        *(.eh_frame_hdr)
        *(.eh_frame)
    }
}

の出力からどのセクションを破棄するかを知っていますobjdump -t kernel.o

于 2012-07-23T19:02:48.807 に答える
-1

シンプルで、gcc を使用しており、制御をメインに渡す前に常に初期化コードを配置します。その起動コードには何があるかわかりませんが、そこにあります。バイナリに 'GNU' というコメントもあることがわかるかもしれませんが、objdump -s -j 'section name' を使用して特定のセクターを出力することはできません。

于 2012-07-23T19:32:09.207 に答える