linux 各类生成件

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;
  }
posted @ 2023-08-27 02:30  chumoath  阅读(24)  评论(0)    收藏  举报