diff --git a/stage23/Makefile b/stage23/Makefile index 03d85e3f..73a4a193 100644 --- a/stage23/Makefile +++ b/stage23/Makefile @@ -50,8 +50,6 @@ endif COM_OUTPUT = false E9_OUTPUT = false -BUILD_ID := $(shell dd if=/dev/urandom count=8 bs=1 2>/dev/null | od -An -t x4 | sed 's/^ /0x/g;s/ //g') - WERROR = -Werror CFLAGS ?= -O3 -g -pipe -Wall -Wextra $(WERROR) @@ -71,7 +69,6 @@ INTERNAL_CFLAGS := \ -mno-sse \ -mno-sse2 \ -MMD \ - -DBUILD_ID=$(BUILD_ID) \ -DLIMINE_VERSION='"$(LIMINE_VERSION)"' \ -DLIMINE_COPYRIGHT='"$(LIMINE_COPYRIGHT)"' \ -DCOM_OUTPUT=$(COM_OUTPUT) \ @@ -141,7 +138,8 @@ INTERNAL_LDFLAGS := \ ifeq ($(TARGET), bios) INTERNAL_LDFLAGS += \ -melf_i386 \ - -static + -static \ + --build-id=sha1 endif ifeq ($(TARGET), uefi) @@ -246,15 +244,43 @@ $(BUILDDIR)/limine_stage2only.elf: $(OBJ) $(TOOLCHAIN_LD) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_stage2only.ld -o $@ || \ ( echo "This error may mean that stage 2 was trying to use stage 3 symbols before loading stage 3" && \ false ) + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s2.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s2.bin build-id.s2.o + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s3.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s3.bin build-id.s3.o + $(TOOLCHAIN_LD) $(BUILDDIR)/build-id.s2.o $(BUILDDIR)/build-id.s3.o $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_stage2only.ld -o $@ $(BUILDDIR)/limine_nomap.elf: $(OBJ) $(BUILDDIR)/tinf/tinfgzip.o $(BUILDDIR)/tinf/tinflate.o $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o $(TOOLCHAIN_LD) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@ + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s2.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s2.bin build-id.s2.o + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s3.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s3.bin build-id.s3.o + $(TOOLCHAIN_LD) $(BUILDDIR)/build-id.s2.o $(BUILDDIR)/build-id.s3.o $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@ $(BUILDDIR)/limine.elf: $(OBJ) $(BUILDDIR)/tinf/tinfgzip.o $(BUILDDIR)/tinf/tinflate.o $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o $(BUILDDIR)/full.map.o $(TOOLCHAIN_LD) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@ + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s2.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s2.bin build-id.s2.o + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s3.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s3.bin build-id.s3.o + $(TOOLCHAIN_LD) $(BUILDDIR)/build-id.s2.o $(BUILDDIR)/build-id.s3.o $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@ $(BUILDDIR)/limine_dbg.elf: $(OBJ) $(BUILDDIR)/tinf/tinfgzip.o $(BUILDDIR)/tinf/tinflate.o $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o $(BUILDDIR)/full.map.o $(TOOLCHAIN_LD) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@ + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s2.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s2.bin build-id.s2.o + $(TOOLCHAIN_OBJCOPY) -O binary --only-section=.note.gnu.build-id $@ $(BUILDDIR)/build-id.s3.bin + cd "$(BUILDDIR)" && \ + $(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s3.bin build-id.s3.o + $(TOOLCHAIN_LD) $(BUILDDIR)/build-id.s2.o $(BUILDDIR)/build-id.s3.o $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@ endif diff --git a/stage23/entry.s2.c b/stage23/entry.s2.c index 663ea65f..65921f54 100644 --- a/stage23/entry.s2.c +++ b/stage23/entry.s2.c @@ -21,8 +21,6 @@ #include #include -extern uint64_t stage3_build_id; - struct volume *boot_volume; #if bios == 1 @@ -32,6 +30,8 @@ static bool stage3_found = false; extern symbol stage3_addr; extern symbol limine_sys_size; +extern symbol build_id_s2; +extern symbol build_id_s3; static bool stage3_init(struct volume *part) { struct file_handle *stage3; @@ -54,7 +54,7 @@ static bool stage3_init(struct volume *part) { fclose(stage3); - if (BUILD_ID != stage3_build_id) { + if (memcmp(build_id_s2 + 16, build_id_s3 + 16, 20) != 0) { print("limine.sys build ID mismatch.\n"); return false; } diff --git a/stage23/entry.s3.c b/stage23/entry.s3.c index f5c91104..7b6afeaf 100644 --- a/stage23/entry.s3.c +++ b/stage23/entry.s3.c @@ -126,9 +126,6 @@ void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { #endif #if bios == 1 -__attribute__((section(".stage3_build_id"))) -uint64_t stage3_build_id = BUILD_ID; - __attribute__((section(".stage3_entry"))) #endif __attribute__((noreturn)) diff --git a/stage23/linker.ld b/stage23/linker.ld index 02308faa..398f627e 100644 --- a/stage23/linker.ld +++ b/stage23/linker.ld @@ -17,6 +17,11 @@ SECTIONS *.s2.o(.text*) } + .stage2.build-id : { + build_id_s2 = .; + *build-id.s2.o(*) + } + .stage2.data : { *.s2.o(.data*) *.s2.o(.rodata*) @@ -26,10 +31,14 @@ SECTIONS .stage3.text : { stage3_addr = .; *(.stage3_entry*) - *(.stage3_build_id*) *(.text*) } + .stage3.build-id : { + build_id_s3 = .; + *build-id.s3.o(*) + } + .stage3.data : { *(.data*) *(.rodata*) @@ -37,6 +46,10 @@ SECTIONS limine_sys_size = . - 0x8000; } + .note.gnu.build-id : { + *(.note.gnu.build-id) + } + .bss : { bss_begin = .; *(COMMON) diff --git a/stage23/linker_dbg.ld b/stage23/linker_dbg.ld index f4e99048..62d5c27c 100644 --- a/stage23/linker_dbg.ld +++ b/stage23/linker_dbg.ld @@ -17,6 +17,11 @@ SECTIONS *.s2.o(.text*) } + .stage2.build-id : { + build_id_s2 = .; + *build-id.s2.o(*) + } + .stage2.data : { *.s2.o(.data*) *.s2.o(.rodata*) @@ -26,10 +31,14 @@ SECTIONS .stage3.text : { stage3_addr = .; *(.stage3_entry*) - *(.stage3_build_id*) *(.text*) } + .stage3.build-id : { + build_id_s3 = .; + *build-id.s3.o(*) + } + .stage3.data : { *(.data*) *(.rodata*) @@ -37,6 +46,10 @@ SECTIONS limine_sys_size = . - 0x8000; } + .note.gnu.build-id : { + *(.note.gnu.build-id) + } + .bss : { bss_begin = .; *(COMMON) diff --git a/stage23/linker_nomap.ld b/stage23/linker_nomap.ld index 6c62b069..cd33c4e8 100644 --- a/stage23/linker_nomap.ld +++ b/stage23/linker_nomap.ld @@ -17,6 +17,11 @@ SECTIONS *.s2.o(.text*) } + .stage2.build-id : { + build_id_s2 = .; + *build-id.s2.o(*) + } + .stage2.data : { *.s2.o(.data*) *.s2.o(.rodata*) @@ -26,10 +31,14 @@ SECTIONS .stage3.text : { stage3_addr = .; *(.stage3_entry*) - *(.stage3_build_id*) *(.text*) } + .stage3.build-id : { + build_id_s3 = .; + *build-id.s3.o(*) + } + .stage3.data : { *(.data*) *(.rodata*) @@ -37,6 +46,10 @@ SECTIONS limine_sys_size = . - 0x8000; } + .note.gnu.build-id : { + *(.note.gnu.build-id) + } + .bss : { bss_begin = .; *(COMMON) diff --git a/stage23/linker_stage2only.ld b/stage23/linker_stage2only.ld index ccd38277..2163dfff 100644 --- a/stage23/linker_stage2only.ld +++ b/stage23/linker_stage2only.ld @@ -17,17 +17,30 @@ SECTIONS *.s2.o(.text*) } + .stage2.build-id : { + build_id_s2 = .; + *build-id.s2.o(*) + } + .stage2.data : { *.s2.o(.data*) *.s2.o(.rodata*) stage2_map = .; stage3_addr = .; - *(.stage3_build_id*) full_map = .; limine_sys_size = .; getchar_internal = .; } + .stage3.build-id : { + build_id_s3 = .; + *build-id.s3.o(*) + } + + .note.gnu.build-id : { + *(.note.gnu.build-id) + } + .bss : { bss_begin = .; *(COMMON)