4

私は i386 リアル モード用の「フリー スタンディング」コードを書いていて、PXE でコードをネットブートしているときに奇妙なエラーに遭遇しました。

PXE-E79: NBP is too big to fit in free base memory
PXE-M0F: Exiting Intel Boot Agent.

バイナリをいじった後、バイナリの後にデータまたはコードがあるとして分離しまし

.data

セグメントマーカー。

16進ダンプの後、ldが命令0x0200000をすべての場所に移動したことがわかりました。

現在、次の方法でフラットビンを生成しています:

ld --oformat binary

質問:

  1. なぜldこれを行うのですか?

  2. oformatこれはオプションに固有のものですか?

4

2 に答える 2

2

1)リンカーがこれを行うのは、おそらくそれがそのように感じられたため(たとえば、80x86の「2MiBページ」との位置合わせのため)であり、「リンカーがどのように感じても」以外のことを行うように指示するリンカースクリプトを提供しなかったためです。 "。

2)すべての出力形式は「リンカーがどのように感じられるか」を実行すると思います(リンカーに別の指示がない限り)。

注:実際の動作は、どこかに隠されているデフォルトのリンカースクリプトによって決定される場合があり、単に「リンカーがどのように感じられるか」ではなく、「OSの分布がどのように感じられるか」である可能性があります。

いずれにせよ、リンカに特定のことを実行させたい場合は、リンカスクリプトを記述して、リンカに具体的に何をしたいかを伝える必要があります。実際に「必要以上に具体的でない」リンカースクリプトを作成した場合は、そのスクリプトをより具体的にする必要があります。

于 2012-05-09T04:34:28.993 に答える
0

1-ld は、デフォルトのリンカー スクリプトを使用します。-v を試して、デフォルトを確認してください 2-oformat に固有のものではありません 3-別のサイズを設定するには、-z max-page-size=0x

0x100 と 0x1000 で試してみましたが、正常に動作しましたが、0x500 では動作しませんでした。

Salu2合計

于 2012-05-10T07:19:06.873 に答える