ubuntu – Informationen zum Code des Makefile-Kompilierungsskripts und des Linker-Skripts LD beim Kompilieren unter Linux
漂亮男人
漂亮男人 2017-06-05 11:10:05
0
1
760

Vor kurzem habe ich ein Tutorial zur Implementierung eines einfachen x86-Betriebssystems gelesen, als ich sah, dass ich zum Konfigurieren der Entwicklungsumgebung Skriptdateien, Makefiles und Linker schreiben muss, die in der Entwicklung verwendet werden. Ich konnte es wirklich nicht verstehen, ich weiß nicht, wie ich mit diesen Codes umgehen soll. Ich hoffe, die Senioren können mir sagen, welche Assemblerkenntnisse und Linux-Operationen ich lernen muss.

Dies ist der Makefile-Code: —————————————————————————————

!Makefile

C_SOURCES = $(Shell find . -name "*.c")

C_OBJECTS = $(patsubst %.c, %.o, $(C_SOURCES))
S_SOURCES = $(Shell find . -name "*.s" )
S_OBJECTS = $(patsubst %.s, %.o, $(S_SOURCES))

CC = gcc

LD = ld
ASM = nasm

C_FLAGS = -c -Wall -m32 -ggdb -gstabs+ -nostdinc -fno-builtin -fno-stack-protector -I include

LD_FLAGS = -T scripts/kernel.ld -m elf_i386 -nostdlib
ASM_FLAGS = -f elf - g-F sticht

alle: $(S_OBJECTS) $(C_OBJECTS) link update_image

.c.o:

@echo 编译代码文件 $< ...
$(CC) $(C_FLAGS) $< -o $@

.s.o:

@echo 编译汇编文件 $< ...
$(ASM) $(ASM_FLAGS) $<

Link:

@echo 链接内核文件...
$(LD) $(LD_FLAGS) $(S_OBJECTS) $(C_OBJECTS) -o hx_kernel

.PHONY:clean

clean:

$(RM) $(S_OBJECTS) $(C_OBJECTS) hx_kernel

.PHONY:update_image

update_image:

sudo mount floppy.img /mnt/kernel
sudo cp hx_kernel /mnt/kernel/hx_kernel
sleep 1
sudo umount /mnt/kernel

.PHONY:mount_image

mount_image:

sudo mount floppy.img /mnt/kernel

.PHONY:umount_image

umount_image:

sudo umount /mnt/kernel

.PHONY:qemu

qemu:

qemu -fda floppy.img -boot a

.PHONY:bochs

bochs:

bochs -f tools/bochsrc.txt

.PHONY:debug

debug:

qemu -S -s -fda floppy.img -boot a &
sleep 1
cgdb -x tools/gdbinit

——————————————————————————————

Dies ist der Linker-Code: —————————————————————————————
/*

  • kernel.ld – Link-Skript geschrieben für das Kernel-Format

    */

EINTRAG(Start)

ABSCHNITTE
{

/* 段起始位置 */

. = 0x100000;
.text :
{
    *(.text)
    . = ALIGN(4096);
}

.data :
{
    *(.data)
    *(.rodata)
    . = ALIGN(4096);
}

.bss :
{
    *(.bss)
    . = ALIGN(4096);
}

.stab :
{
    *(.stab)
    . = ALIGN(4096);
}

.stabstr :
{
    *(.stabstr)
    . = ALIGN(4096);
}

/DISCARD/ : { *(.comment) *(.eh_frame) }

}

————————————————————————————

漂亮男人
漂亮男人

Antworte allen(1)
漂亮男人

这个不需要懂汇编。你需要学习 Makefile 和 ld script。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage