GZIP-compressed files end with 4 byte data that represents the size
of the original input. The decompressors (the self-extracting kernel)
exploit it to know the vmlinux size beforehand. To mimic the GZIP's
trailer, Kbuild provides cmd_{bzip2,lzma,lzo,lz4,xzkern,zstd22}.
Unfortunately these macros are used everywhere despite the appended
size data is only useful for the decompressors.
There is no guarantee that such hand-crafted trailers are safely ignored.
In fact, the kernel refuses compressed initramdfs with the garbage data.
That is why usr/Makefile overrides size_append to make it no-op.
To limit the use of such broken compressed files, this commit renames
the existing macros as follows:
cmd_bzip2 --> cmd_bzip2_with_size
cmd_lzma --> cmd_lzma_with_size
cmd_lzo --> cmd_lzo_with_size
cmd_lz4 --> cmd_lz4_with_size
cmd_xzkern --> cmd_xzkern_with_size
cmd_zstd22 --> cmd_zstd22_with_size
To keep the decompressors working, I updated the following Makefiles
accordingly:
arch/arm/boot/compressed/Makefile
arch/h8300/boot/compressed/Makefile
arch/mips/boot/compressed/Makefile
arch/parisc/boot/compressed/Makefile
arch/s390/boot/compressed/Makefile
arch/sh/boot/compressed/Makefile
arch/x86/boot/compressed/Makefile
I reused the current macro names for the normal usecases; they produce
the compressed data in the proper format.
I did not touch the following:
arch/arc/boot/Makefile
arch/arm64/boot/Makefile
arch/csky/boot/Makefile
arch/mips/boot/Makefile
arch/riscv/boot/Makefile
arch/sh/boot/Makefile
kernel/Makefile
This means those Makefiles will stop appending the size data.
I dropped the 'override size_append' hack from usr/Makefile.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <n.schier@avm.de>
5.7 KiB
This file is subject to the terms and conditions of the GNU General Public
License.
Adapted for MIPS Pete Popov, Dan Malek
Copyright (C) 1994 by Linus Torvalds
Adapted for PowerPC by Gary Thomas
modified by Cort (cort@cs.nmt.edu)
Copyright (C) 2009 Lemote Inc. & DSLab, Lanzhou University
Author: Wu Zhangjin wuzhangjin@gmail.com
include $(srctree)/arch/mips/Kbuild.platforms
set the default size of the mallocing area for decompressing
BOOT_HEAP_SIZE := 0x400000
Disable Function Tracer
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_FTRACE), $(KBUILD_CFLAGS))
KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS))
Disable lq/sq in zboot
ifdef CONFIG_CPU_LOONGSON64 KBUILD_CFLAGS := $(filter-out -march=loongson3a, $(KBUILD_CFLAGS)) -march=mips64r2 endif
KBUILD_CFLAGS := $(KBUILD_CFLAGS) -D__KERNEL__ -D__DISABLE_EXPORTS
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull"
KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE)
-DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
KCOV_INSTRUMENT := n GCOV_PROFILE := n UBSAN_SANITIZE := n
decompressor objects (linked with vmlinuz)
vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o $(obj)/bswapsi.o
ifdef CONFIG_DEBUG_ZBOOT vmlinuzobjs-$(CONFIG_DEBUG_ZBOOT) += $(obj)/dbg.o vmlinuzobjs-$(CONFIG_SYS_SUPPORTS_ZBOOT_UART16550) += $(obj)/uart-16550.o vmlinuzobjs-$(CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM) += $(obj)/uart-prom.o vmlinuzobjs-$(CONFIG_MIPS_ALCHEMY) += $(obj)/uart-alchemy.o vmlinuzobjs-$(CONFIG_ATH79) += $(obj)/uart-ath79.o endif
vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o
vmlinuzobjs-$(CONFIG_KERNEL_ZSTD) += $(obj)/bswapdi.o $(obj)/ashldi3.o
targets := $(notdir $(vmlinuzobjs-y))
targets += vmlinux.bin
OBJCOPYFLAGS_vmlinux.bin := $(OBJCOPYFLAGS) -O binary -R .comment -S
$(obj)/vmlinux.bin: $(KBUILD_IMAGE) FORCE $(call if_changed,objcopy)
tool_$(CONFIG_KERNEL_GZIP) = gzip tool_$(CONFIG_KERNEL_BZIP2) = bzip2_with_size tool_$(CONFIG_KERNEL_LZ4) = lz4_with_size tool_$(CONFIG_KERNEL_LZMA) = lzma_with_size tool_$(CONFIG_KERNEL_LZO) = lzo_with_size tool_$(CONFIG_KERNEL_XZ) = xzkern_with_size tool_$(CONFIG_KERNEL_ZSTD) = zstd22_with_size
targets += vmlinux.bin.z
$(obj)/vmlinux.bin.z: $(obj)/vmlinux.bin FORCE $(call if_changed,$(tool_y))
targets += piggy.o dummy.o
OBJCOPYFLAGS_piggy.o := --add-section=.image=$(obj)/vmlinux.bin.z
--set-section-flags=.image=contents,alloc,load,readonly,data
$(obj)/piggy.o: $(obj)/dummy.o $(obj)/vmlinux.bin.z FORCE $(call if_changed,objcopy)
HOSTCFLAGS_calc_vmlinuz_load_addr.o += $(LINUXINCLUDE)
Calculate the load address of the compressed kernel image
hostprogs := calc_vmlinuz_load_addr
ifneq ($(zload-y),)
VMLINUZ_LOAD_ADDRESS := $(zload-y)
else
VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr
$(obj)/vmlinux.bin $(LINKER_LOAD_ADDRESS))
endif
UIMAGE_LOADADDR = $(VMLINUZ_LOAD_ADDRESS)
vmlinuzobjs-y += $(obj)/piggy.o
targets += ../../../../vmlinuz
quiet_cmd_zld = LD $@ cmd_zld = $(LD) $(KBUILD_LDFLAGS) -Ttext $(VMLINUZ_LOAD_ADDRESS) -T $< $(vmlinuzobjs-y) -o $@ quiet_cmd_strip = STRIP $@ cmd_strip = $(STRIP) -s $@
$(objtree)/vmlinuz: $(src)/ld.script $(vmlinuzobjs-y) $(obj)/calc_vmlinuz_load_addr $(call cmd,zld) $(call cmd,strip)
objboot := $(objtree)/arch/mips/boot
$(objboot)/vmlinuz: $(objtree)/vmlinuz FORCE
Some DECstations need all possible sections of an ECOFF executable
ifdef CONFIG_MACH_DECSTATION e2eflag := -a endif
elf2ecoff can only handle 32bit image
hostprogs += ../elf2ecoff
ifdef CONFIG_32BIT VMLINUZ = $(objtree)/vmlinuz else VMLINUZ = $(objboot)/vmlinuz.32 endif
targets += ../vmlinuz.32
quiet_cmd_32 = OBJCOPY $@ cmd_32 = $(OBJCOPY) -O $(32bit-bfd) $(OBJCOPYFLAGS) $< $@
$(objboot)/vmlinuz.32: $(objtree)/vmlinuz $(call cmd,32)
targets += ../vmlinuz.ecoff
quiet_cmd_ecoff = ECOFF $@ cmd_ecoff = $< $(VMLINUZ) $@ $(e2eflag)
$(objboot)/vmlinuz.ecoff: $(objboot)/elf2ecoff $(VMLINUZ) $(call cmd,ecoff)
targets += ../vmlinuz.bin
OBJCOPYFLAGS_vmlinuz.bin := $(OBJCOPYFLAGS) -O binary
$(objboot)/vmlinuz.bin: $(objtree)/vmlinuz $(call cmd,objcopy)
targets += ../vmlinuz.srec
OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec
$(objboot)/vmlinuz.srec: $(objtree)/vmlinuz $(call cmd,objcopy)
targets += ../uzImage.bin
$(objboot)/uzImage.bin: $(objboot)/vmlinuz.bin FORCE $(call if_changed,uimage,none)
Flattened Image Tree (.itb) image
ifeq ($(ADDR_BITS),32) itb_addr_cells = 1 endif ifeq ($(ADDR_BITS),64) itb_addr_cells = 2 endif
targets += ../vmlinuz.its.S
quiet_cmd_its_cat = CAT $@ cmd_its_cat = cat $(real-prereqs) >$@
$(objboot)/vmlinuz.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS)) FORCE $(call if_changed,its_cat)
targets += ../vmlinuz.its
quiet_cmd_cpp_its_S = ITS $@
cmd_cpp_its_S = $(CPP) -P -C -o $@ $<
-DKERNEL_NAME=""Linux $(KERNELRELEASE)""
-DVMLINUX_BINARY=""$(2)""
-DVMLINUX_COMPRESSION=""none""
-DVMLINUX_LOAD_ADDRESS=$(VMLINUZ_LOAD_ADDRESS)
-DVMLINUX_ENTRY_ADDRESS=$(VMLINUZ_LOAD_ADDRESS)
-DADDR_BITS=$(ADDR_BITS)
-DADDR_CELLS=$(itb_addr_cells)
$(objboot)/vmlinuz.its: $(objboot)/vmlinuz.its.S FORCE $(call if_changed,cpp_its_S,vmlinuz.bin)
targets += ../vmlinuz.itb
quiet_cmd_itb-image = ITB $@
cmd_itb-image =
env PATH="$(objtree)/scripts/dtc:$(PATH)"
$(BASH) $(MKIMAGE)
-D "-I dts -O dtb -p 500
--include $(objtree)/arch/mips
--warning no-unit_address_vs_reg"
-f $(2) $@
$(objboot)/vmlinuz.itb: $(objboot)/vmlinuz.its $(objboot)/vmlinuz.bin FORCE $(call if_changed,itb-image,$<)