objcopy
-S
--strip-all
Do not copy relocation and symbol information from the source file.
Also deletes debug sections.
# 去除某个段: -R .comment
-R sectionpattern
--remove-section=sectionpattern
--remove-section=.text.* --remove-section=!.text.foo
生成件
# 0. 通用寻找方法
生成件目录 -> .生成件.cmd
# 1. /vmlinux
编译链接成的 elf 文件
cmd_vmlinux := sh scripts/link-vmlinux.sh "arm-linux-gnueabi-ld" "-EL" "--no-undefined -X --pic-veneer -z norelro --build-id=sha1 --orphan-handling=warn"; true
# 1.1 /vmlinux.o
# -EL 小端 -r 生成可重定向文件,而不是 可执行文件
# --whole-archive *.a --no-whole-archive 将中间的库中的目标文件都包含在输出
cmd_vmlinux.o := arm-linux-gnueabi-ld -EL -r -o vmlinux.o --whole-archive arch/arm/kernel/head.o init/built-in.a usr/built-in.a arch/arm/built-in.a arch/arm/mach-versatile/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 arch/arm/lib/built-in.a lib/built-in.a arch/arm/lib/lib.a lib/lib.a drivers/built-in.a sound/built-in.a net/built-in.a virt/built-in.a --no-whole-archive --start-group --end-group
# 2. Image
使用 objcopy 去掉描述文件,纯指令 + 数据
cmd_arch/arm/boot/Image := arm-linux-gnueabi-objcopy -O binary -R .comment -S vmlinux arch/arm/boot/Image
# 3. zImage
压缩 Image,并在头部添加 自解压代码
cmd_arch/arm/boot/zImage := arm-linux-gnueabi-objcopy -O binary -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage
# 4. uImage
在 zImage 头部添加 64B,u-boot 专用
cmd_arch/arm/boot/uImage := bash ./scripts/mkuboot.sh -A arm -O linux -C none -T kernel -a 0 -e 0 -n 'Linux-5.19.0' -d arch/arm/boot/zImage arch/arm/boot/uImage
# 5. arch/arm/boot/compressed/vmlinux
vmlinux: vmlinux.lds $(HEAD) piggy.o \
$(addprefix $(obj)/, $(OBJS)) \
$(efi-obj-y) FORCE
$(call if_changed,ld)
piggy_data: Image FORCE
$(call if_changed,$(compress-y))
piggy.o: piggy_data
# 6. piggy_data
# piggy_data 是 压缩 Image 得到的
cmd_arch/arm/boot/compressed/piggy_data := cat arch/arm/boot/compressed/../Image | gzip -n -f -9 > arch/arm/boot/compressed/piggy_data
# 7. piggy.o
piggy.S
# 添加一个段,为 .piggydata
.section .piggydata, "a"
.globl input_data
input_data:
# 直接将一个文件放进来,不做任何处理
.incbin "arch/arm/boot/compressed/piggy_data"
.globl input_data_end
input_data_end:
# 8. vmlinux
cmd_arch/arm/boot/compressed/vmlinux := arm-linux-gnueabi-ld -EL -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/decompress.o arch/arm/boot/compressed/string.o arch/arm/boot/compressed/hyp-stub.o arch/arm/boot/compressed/fdt_rw.o arch/arm/boot/compressed/fdt_ro.o arch/arm/boot/compressed/fdt_wip.o arch/arm/boot/compressed/fdt.o arch/arm/boot/compressed/fdt_check_mem_start.o arch/arm/boot/compressed/lib1funcs.o arch/arm/boot/compressed/ashldi3.o arch/arm/boot/compressed/bswapsdi2.o -o arch/arm/boot/compressed/vmlinux
将 piggy_data 和 解压缩的代码链接在一起
# 9. vmlinux.lds
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
/DISCARD/ : {
*(.discard) *(.discard.*) *(.modinfo) *(.gnu.version*)
*(.ARM.exidx*)
*(.ARM.extab*)
*(.note.*)
*(.rel.*)
*(.data)
}
. = 0;
_text = .;
# 自解压代码
.text : {
_start = .;
# head.S
*(.start)
# other -> 链接时会进行重定向,所以不用担心顺序
*(.text)
*(.text.*)
*(.gnu.warning) *(.glue_7) *(.glue_7t) *(.vfp11_veneer) *(.v4_bx)
}
.table : ALIGN(4) {
_table_start = .;
LONG((6))
LONG((0x5a534c4b))
# piggy_data 大小 + 解压代码的大小
LONG((__piggy_size_addr - _start))
LONG((_kernel_bss_size))
LONG((0x00008000))
LONG((65536))
LONG(0)
_table_end = .;
}
.rodata : {
*(.rodata)
*(.rodata.*)
*(.data.rel.ro)
}
.piggydata : {
*(.piggydata)
__piggy_size_addr = . - 4;
}