//linux顶层Makefile定义的默认目标
all: vmlinux
//vmlinux的依赖
vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
+$(call if_changed_dep,link-vmlinux)
//vmlinux-deps的定义
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
//$(patsubst 原模式, 目标模式, 文件列表)
KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y))
KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y))
core-y := init/ usr/ arch/$(SRCARCH)/
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
drivers-y := drivers/ sound/
drivers-$(CONFIG_SAMPLES) += samples/
drivers-$(CONFIG_NET) += net/
drivers-y += virt/
libs-y := lib/
KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
/*
KBUILD_LDS
The linker script with full path. Assigned by the top-level Makefile.
KBUILD_LDS_MODULE
The module linker script with full path. Assigned by the top-level
Makefile and additionally by the arch Makefile.
KBUILD_VMLINUX_OBJS
All object files for vmlinux. They are linked to vmlinux in the same
order as listed in KBUILD_VMLINUX_OBJS.
KBUILD_VMLINUX_LIBS
All .a "lib" files for vmlinux. KBUILD_VMLINUX_OBJS and
KBUILD_VMLINUX_LIBS together specify all the object files used to
link vmlinux.
*/
//编译Linux内核
make V=1 |& tee kernel_build.txt
//链接生成vmlinux.o的命令,内核构建生成vmlinux.o的目的是原因并是生成Module.symvers(Symbol version dump文件)其中包含内核及内部模块所导出的各种符号及其相关CRC校验值
ld -m elf_x86_64 -r
-o vmlinux.o
--whole-archive arch/x86/kernel/head_64.o
arch/x86/kernel/head64.o
arch/x86/kernel/ebda.o
arch/x86/kernel/platform-quirks.o
init/built-in.a
usr/built-in.a
arch/x86/built-in.a
kernel/built-in.a
certs/built-in.a
mm/built-in.a
fs/built-in.a
ipc/built-in.a
security/built-in.a
crypto/built-in.a
block/built-in.a
lib/built-in.a
arch/x86/lib/built-in.a
lib/lib.a
arch/x86/lib/lib.a
drivers/built-in.a
sound/built-in.a
net/built-in.a
virt/built-in.a
arch/x86/pci/built-in.a
arch/x86/power/built-in.a
arch/x86/video/built-in.a
--no-whole-archive --start-group --end-group
//生成vmlinux.symvers, Module.symvers文件
scripts/mod/modpost -o vmlinux.symvers vmlinux.o
cat vmlinux.symvers modules-only.symvers > Module.symvers
//链接生成vmlinux的命令
ld -m elf_x86_64 --emit-relocs --discard-none -z max-page-size=0x200000 --build-id=sha1 -X --orphan-handling=warn
-o vmlinux
-T ./arch/x86/kernel/vmlinux.lds
--whole-archive arch/x86/kernel/head_64.o
arch/x86/kernel/head64.o
arch/x86/kernel/ebda.o
arch/x86/kernel/platform-quirks.o
init/built-in.a
usr/built-in.a
arch/x86/built-in.a
kernel/built-in.a
certs/built-in.a
mm/built-in.a
fs/built-in.a
ipc/built-in.a
security/built-in.a
crypto/built-in.a
block/built-in.a
lib/built-in.a
arch/x86/lib/built-in.a
lib/lib.a
arch/x86/lib/lib.a
drivers/built-in.a
sound/built-in.a
net/built-in.a
virt/built-in.a
arch/x86/pci/built-in.a
arch/x86/power/built-in.a
arch/x86/video/built-in.a
--no-whole-archive --start-group --end-group .tmp_vmlinux.kallsyms2.o
.btf.vmlinux.bin.o
//生成arch/x86/boot/compressed/vmlinux.bin
//-S --strip-all Remove all symbol and relocation information
//-R --remove-section <name> Remove section <name> from the output
objcopy -R .comment -S vmlinux arch/x86/boot/compressed/vmlinux.bin
//生成内核压缩文件arch/x86/boot/compressed/vmlinux.bin.zst
{ cat arch/x86/boot/compressed/vmlinux.bin arch/x86/boot/compressed/vmlinux.relocs | zstd -22 --ultra; printf \\230\\233\\220\\003; } > arch/x86/boot/compressed/vmlinux.bin.zst
//生成piggy.S
arch/x86/boot/compressed/mkpiggy arch/x86/boot/compressed/vmlinux.bin.zst > arch/x86/boot/compressed/piggy.S
//生成piggy.o
gcc -Wp,-MMD,arch/x86/boot/compressed/.piggy.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/11/include -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -D__KERNEL__ -fmacro-prefix-map=./= -m64 -O2 -fno-strict-aliasing -fPIE -Wundef -DDISABLE_BRANCH_PROFILING -mcmodel=small -mno-red-zone -mno-mmx -mno-sse -ffreestanding -fshort-wchar -fno-stack-protector -Wno-address-of-packed-member -Wno-pointer-sign -fmacro-prefix-map=./= -fno-asynchronous-unwind-tables -D__DISABLE_EXPORTS -Wa,-mrelax-relocations=no -include ./include/linux/hidden.h -D__ASSEMBLY__ -c -o arch/x86/boot/compressed/piggy.o arch/x86/boot/compressed/piggy.S
//链接生成arch/x86/boot/compressed/vmlinux
ld -m elf_x86_64 --no-ld-generated-unwind-info -pie --no-dynamic-linker --orphan-handling=warn -T arch/x86/boot/compressed/vmlinux.lds
arch/x86/boot/compressed/kernel_info.o
arch/x86/boot/compressed/head_64.o
arch/x86/boot/compressed/misc.o
arch/x86/boot/compressed/string.o
arch/x86/boot/compressed/cmdline.o
arch/x86/boot/compressed/error.o
arch/x86/boot/compressed/piggy.o
arch/x86/boot/compressed/cpuflags.o
arch/x86/boot/compressed/early_serial_console.o
arch/x86/boot/compressed/kaslr.o
arch/x86/boot/compressed/ident_map_64.o
arch/x86/boot/compressed/idt_64.o
arch/x86/boot/compressed/idt_handlers_64.o
arch/x86/boot/compressed/mem_encrypt.o
arch/x86/boot/compressed/pgtable_64.o
arch/x86/boot/compressed/sev.o
arch/x86/boot/compressed/acpi.o
arch/x86/boot/compressed/efi_thunk_64.o
drivers/firmware/efi/libstub/lib.a
-o arch/x86/boot/compressed/vmlinux
//生成arch/x86/boot/setup.bin
objcopy -O binary arch/x86/boot/setup.elf arch/x86/boot/setup.bin
//生成arch/x86/boot/vmlinux.bin
objcopy -O binary -R .note -R .comment -S arch/x86/boot/compressed/vmlinux arch/x86/boot/vmlinux.bin
//生成arch/x86/boot/bzImage
arch/x86/boot/tools/build arch/x86/boot/setup.bin arch/x86/boot/vmlinux.bin arch/x86/boot/zoffset.h arch/x86/boot/bzImage