build.sh (2294B)
1 #!/bin/sh 2 3 TARGET="${1:-amd64}" 4 5 AS="clang" 6 CC="clang" 7 LD="ld.lld" 8 9 NM="llvm-nm" 10 OBJCOPY="llvm-objcopy" 11 12 WARNINGS="-Wall -Wextra -Wpedantic -Werror -Wno-fixed-enum-extension" 13 CFLAGS="-std=c11 -ffreestanding -fPIC -fno-stack-protector -mno-red-zone" 14 CPPFLAGS="-Iinclude" 15 LDFLAGS="" 16 17 case $TARGET in 18 amd64) 19 TRIPLE="x86_64-none-elf" 20 UEFIARCH="X64" 21 KERNARCH="AMD64" 22 ;; 23 arm64) 24 TRIPLE="aarch64-none-elf" 25 UEFIARCH="AA64" 26 KERNARCH="ARM64" 27 ;; 28 *) 29 echo "Unsupported target: $TARGET, must be one of: amd64 arm64" 30 exit 1 31 ;; 32 esac 33 34 KASFLAGS="-target $TRIPLE" 35 KCFLAGS="-target $TRIPLE $CFLAGS $WARNINGS" 36 KCPPFLAGS="$CPPFLAGS -D__KERNEL__=1 -D__KERNEL_${KERNARCH}__=1" 37 KLDFLAGS="$LDFLAGS -T src/kernel.lds" 38 39 set -ex 40 41 mkdir -p bin obj mnt 42 43 # build kernel 44 $CC $KCFLAGS $KCPPFLAGS -c src/efistub.c -o obj/efistub.o 45 $CC $KCFLAGS $KCPPFLAGS -c src/kernel.c -o obj/kernel.o 46 $LD $KLDFLAGS obj/efistub.o obj/kernel.o -o bin/kernel.elf 47 48 ## generate kernel symbol offset header 49 SEDSCRIPT="s/^\([0-9a-fA-F]*\) [a-zA-Z] \(__.*\)/#define \2 0x\1/p" 50 $NM bin/kernel.elf | sed -ne "$SEDSCRIPT" > obj/voffset.h 51 52 ## generate efistub 53 $AS $KASFLAGS $KCPPFLAGS -Iobj -c src/header.S -o obj/header.o 54 55 ## create binary image 56 $OBJCOPY -O binary -R .head -S bin/kernel.elf bin/kernel.bin 57 $OBJCOPY -O binary -S obj/header.o bin/header.bin 58 cat bin/header.bin bin/kernel.bin > bin/kernel.efi 59 60 # build disk image (64 MiB ESP, 32 MiB data) 61 # --- 62 # see: https://wiki.osdev.org/Bootable_Disk 63 64 dd if=/dev/zero of=mnt/disk.img bs=1M count=96 status=none 65 66 cat <<EOF | sfdisk mnt/disk.img 67 unit: sectors 68 label: gpt 69 70 type=U, start=2048, size=131072, bootable 71 type=L, start=$((2048+131072)) 72 EOF 73 74 ## write ESP 75 dd if=/dev/zero of=mnt/esp.img bs=512 count=131072 status=none 76 77 mformat -i mnt/esp.img -F :: 78 mmd -i mnt/esp.img ::/EFI ::/EFI/BOOT 79 mcopy -i mnt/esp.img bin/kernel.efi ::/EFI/BOOT/BOOT$UEFIARCH.EFI 80 81 dd if=mnt/esp.img of=mnt/disk.img bs=512 count=131072 seek=2048 conv=notrunc status=none 82 83 ## write data partition 84 dd if=/dev/zero of=mnt/dat.img bs=512 count=$((65535-2048-33)) status=none 85 86 mformat -i mnt/dat.img :: 87 88 ## TODO: copy over any relevant data 89 90 dd if=mnt/dat.img of=mnt/disk.img bs=512 seek=$((2048+141072)) conv=notrunc status=none 91 92 # run image under QEMU 93 scripts/qemu-$TARGET.sh $(realpath mnt/disk.img)