私はC言語で2〜3年勉強していますが、最近アセンブリを取り上げましたが、私はWindowsを使っているので、以前はVisual Studioを使っていたので、 Cygwinとi686のクロスコンパイラを使ってCとアセンブリファイルをコンパイルし、それらをリンクして私のオペレーティングシステムを表すバイナリファイルにしています。私はファイルを作るために新しいので、私はこれを正しく行う方法を知らない。x86とcをメイクファイルでコンパイル
CC = i686-elf-gcc
CC_FLAGS = -c -std=gnu99 -ffreestanding -O2 -Wall -Wextra -I./include
AS = i686-elf-as
LD = i686-elf-gcc -T linker.ld -o myos.bin
LD_FLAGS = -ffreestanding -O2 -nostdlib -lgcc
O_FILES = $(wildcard src/*.o)
all: $(O_FILES)
$(LD) $(LD_FLAGS) $(O_FILES)
src/%.o: src/%.c
$(CC) $(CC_FLAGS) -o [email protected] $<
src/%.o: src/%.asm
$(AS) -o [email protected] $<
私は、リンカはそう明らかに何もコンパイルされていないエントリのシンボル_start
を見つけることができないというエラーを取得しています:これは私がこれまでにMakefile
のための持っているものです。どうすればこの問題を解決できますか?エントリポイントとして_start
を定義
マイsrc/linker.ld
ファイルは次のとおりです。
ENTRY(_start)
SECTIONS
{
. = 1M;
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
}
私はそれを使用していsrc/boot.asm
ファイルには、私の_start
ラベルは定義されています。
# Declare constants for the multiboot header.
.set ALIGN, 1<<0 # align loaded modules on page boundaries
.set MEMINFO, 1<<1 # provide memory map
.set FLAGS, ALIGN | MEMINFO # this is the Multiboot 'flag' field
.set MAGIC, 0x1BADB002 # 'magic number' lets bootloader find the header
.set CHECKSUM, -(MAGIC + FLAGS) # checksum of above, to prove we are multiboot
.section .multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .bss
.align 16
stack_bottom:
.skip 16384 # 16 KiB
stack_top:
.section .text
.global _start
.type _start, @function
_start:
mov $stack_top, %esp
call kernel_main
cli
1: hlt
jmp 1b
.size _start, . - _start
エラーは、リンカーエラーです。 'linker.ld'を表示せず、' _start'のエントリポイントを使っているように聞こえますが、あなたのコードには '_start'というラベルはありません。 –
_startはboot.asmで定義されており、ここではlinker.ldです。https://pastebin.com/MuJxLQW8 –
あなたの 'boot.asm'を表示できますか?問題はこれが最小限の完全に検証可能な例ではないということです。あなたがプロジェクト全体を利用可能にしたならば、それはさらに良いでしょう。 –