Heim  >  Fragen und Antworten  >  Hauptteil

ubuntu – Informationen zum Code des Makefile-Kompilierungsskripts und des Linker-Skripts LD beim Kompilieren unter Linux

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: —————————————————————————————
/*

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) }

}

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

漂亮男人漂亮男人2692 Tage vor731

Antworte allen(1)Ich werde antworten

  • 漂亮男人

    漂亮男人2017-06-05 11:12:05

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

    Antwort
    0
  • StornierenAntwort