build: Get build-id from linker instead of generating a random one

This commit is contained in:
mintsuki 2021-11-08 09:42:41 +01:00
parent 2caf1eaec0
commit 0c073fcc44
7 changed files with 89 additions and 14 deletions

View File

@ -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

View File

@ -21,8 +21,6 @@
#include <drivers/disk.h>
#include <sys/idt.h>
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;
}

View File

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

View File

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

View File

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

View File

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

View File

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