この質問とそれが主な回答を読んだ後、カーネルで readelf を実行したところ、.text セクションが 0x00100000 ではなく 0x00101000 にあることに気付きました。また、.text セクションがあるはずの場所に .not.gnu.build-i と書かれている上記のセクションに気付きました。.text セクションを正しい場所に配置する方法はありますか? align 4
以前は1Mに設定していました。
2 に答える
問題は、LD
(またはGCC経由のLD ) が最初の 4k にノートセクション (生成された場合) を自動的に配置することです。最終的なカーネルをGCCとリンクする場合は、オプションを渡します。最終的なバイナリをリンクするためにLDを直接使用している場合は、それを渡すことができます。-Wl,--build-id=none
--build-id=none
マルチブートELFオブジェクトを書き込む場合、この余分なセクションが存在すると、マルチブート ヘッダーがファイル内の 8k の位置を超えてしまう可能性があります。これは、ELFヘッダーが通常、ファイルの最初の 4k を最小限に抑えるという事実を説明しています。セクションの 4k を追加する.note.gnu.build-id
と.multiboot
、物理ファイルの 8k マークを超えています。これにより、GRUB などのマルチブート ローダーは、ファイルの最初の 8k しか調べないため、 ELF実行可能ファイルにマルチブート ヘッダーがないと判断します。
リンカー スクリプト (他の質問と同じであると仮定) が問題です。セクションを 4k に揃えてmultiboot
別のセクションに配置するように指示することで、それに 4k を割り当てるため.text
、1M + のオフセットから開始します。 4k、これが問題の原因です。次のように変更します。
SECTIONS
{
. = 1M;
.text ALIGN(4K) :
{
*(.multiboot)
*(.text)
}
[snip]