0

ファイルにリンクしようとしています-メイン関数を含むacファイルと、単にメインにジャンプするasmファイル。

mingwをインストールしました。私のファイル:

//kernel.c
void some_function(){
}
void main(){
char* video_memory = (char*) 0xb8000;
*video_memory = 'X';
some_function();
}

;kernel_entry.asm
[bits 32]
[extern main]
call main
jmp $

ビルドするために呼び出すコマンド:

gcc -ffreestanding -c kernel.c -o kernel.o
nasm kernel_entry.asm -f elf -o kernel_entry.o
ld -o kernel.bin -Ttext 0x1000 kernel_entry.o kernel.o

私が得ているエラー:

kernel_entry.o:(.text+0x1): undefined reference to `main'
kernel.o:kernel.c:(.text+0xf): undefined reference to `__main'

編集:

どのコマンドが機能しますか:

ld -r -o kernel.out -Ttext 0x1000 kernel.o
objcopy -O binary -j .text kernel.out kernel.bin

-ri を指定して ld を実行しようとすると、エラーが発生します。

ld: Relocatable linking with relocations from format elf32-i386 (kernel_entry.o)
 to format pe-i386 (kernel.bin) is not supported

EDIT2:これらのコマンドを使用すると、最良の結果が得られました。

gcc -ffreestanding -c kernel.c -o kernel.o
nasm kernel_entry.asm -f win32 -o kernel_entry.o
ld -r -o kernel.out -Ttext 0x1000 kernel_entry.o kernel.o
objcopy -O binary -j .text kernel.out kernel.bin

ファイルは正常にリンクされましたが、実行時にメインが呼び出されません。coff 形式でも試してみましたが、リンクもしますが、Bochs は再起動し続けます。

4

1 に答える 1

2

最初のエラーは、C では関数の名前が_nameであるため、そのように呼び出すことはできません。main呼び出す必要があります_main。TASM では、呼び出し規約を設定できるため、アセンブラーは自動的に適切な関数を呼び出すことができます。nasm にもそのような機能があるかどうかはわかりません。

2 番目の問題はおそらく、リンカーを直接呼び出しているためです。この場合、C スタートアップ モジュールを指定する必要があります。これは通常、コンパイラによってリンカー オプションに追加されます。通常、これは のような名前のファイルだと思いますcrt0。独自のスタートアップ コードを記述する場合は、これを自分で提供する必要があります。このモジュールは、OS 固有のエントリ ポイントから C の環境をセットアップします。これがあなたのプロジェクトに欠けていると思います。

http://en.wikipedia.org/wiki/Crt0

于 2013-08-10T20:22:50.280 に答える