私は 32 ビット プロテクト モード カーネルで作業しています。テキスト領域が 0x100000 で始まるコードを生成しようとしています。次のコマンドを発行します:=
ld -melf_i386 $(OBJS)-o カーネル -Ttext 0x100000
結果の 32 ビット ELF ファイルを調べると、e_entry が 0x100000 であることが予想されます。しかし、そうではありません。理由がわからないので、それが私の質問です。カーネルの一部は nasm で記述されており、32 ビット ELF をターゲットにして 64 ビット Linux でコンパイルされています。上記の ld コマンドによって生成される実際の e_entry 値は 0x116D5A です。これは、-fpic などの必要なコンパイラ オプションに関係しているのか、nasm 生成コードとの非互換性に関係しているのか、それとも ld にバグがあるのか 疑問に思っています。誰か助けてください。ありがとう
:= ld -r -melf_i386 $(OBJS)-o kernel -Ttext 0x100000 のように、上記の ld に -r オプションを指定することに注意してください。
e_entry が 0x100000 の出力を生成しますが、ファイルは実行可能ファイルではありません。実行可能ファイルにする必要があります。