github.com/google/syzkaller@v0.0.0-20240517125934-c0f1611a36d6/sys/linux/binfmt.txt (about)

     1  # Copyright 2018 syzkaller project authors. All rights reserved.
     2  # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
     3  
     4  include <uapi/linux/a.out.h>
     5  include <uapi/linux/elf.h>
     6  
     7  execve(file ptr[in, filename], argv ptr[in, array[ptr[in, string]]], envp ptr[in, array[ptr[in, string]]])
     8  execveat(dirfd fd_dir, file ptr[in, filename], argv ptr[in, array[ptr[in, string]]], envp ptr[in, array[ptr[in, string]]], flags flags[at_flags])
     9  
    10  write$binfmt_script(fd fd, data ptr[in, binfmt_script], len bytesize[data])
    11  write$binfmt_misc(fd fd, data ptr[in, binfmt_misc], len bytesize[data])
    12  write$binfmt_aout(fd fd, data ptr[in, binfmt_aout], len bytesize[data])
    13  write$binfmt_elf32(fd fd, data ptr[in, binfmt_elf32], len bytesize[data])
    14  write$binfmt_elf64(fd fd, data ptr[in, binfmt_elf64], len bytesize[data])
    15  
    16  binfmt_script {
    17  	hdr	stringnoz["#! "]
    18  	bin	stringnoz[filename]
    19  	args	array[binfmt_script_arg]
    20  	nl	const[0xa, int8]
    21  	data	array[int8]
    22  } [packed]
    23  
    24  binfmt_script_arg {
    25  	sp	const[0x20, int8]
    26  	arg	stringnoz
    27  }
    28  
    29  binfmt_misc {
    30  	hdr	stringnoz[binfmt_misc_headers]
    31  	data	array[int8]
    32  }
    33  
    34  binfmt_misc_headers = "syz0", "syz1"
    35  
    36  binfmt_aout {
    37  	exec	exec
    38  	data	array[int8]
    39  # Just to make the file of a non-trivial size.
    40  	pad	array[array[const[0, int64], 32], 0:10]
    41  } [packed]
    42  
    43  exec {
    44  	magic		flags[aouthdr_magics, int16]
    45  	machtype	int8
    46  	flags		int8
    47  	a_text		int32[0:1000]
    48  	a_data		int32[0:1000]
    49  	a_bss		int32
    50  	a_syms		int32[0:1000]
    51  	a_entry		int32
    52  	a_trsize	const[0, int32]
    53  	a_drsize	const[0, int32]
    54  }
    55  
    56  aouthdr_magics = OMAGIC, NMAGIC, ZMAGIC, QMAGIC
    57  
    58  type binfmt_elf32 binfmt_elf[int32, elf32_phdr, ELF32_PHDR_SIZE]
    59  type binfmt_elf64 binfmt_elf[int64, elf64_phdr, ELF64_PHDR_SIZE]
    60  
    61  type binfmt_elf[ADDR, PHDR, PHENTSIZE] {
    62  	hdr	elf_hdr[ADDR, PHENTSIZE]
    63  	phdr	array[PHDR, 1:2]
    64  	data	array[int8]
    65  # Just to make the file of a non-trivial size.
    66  	pad	array[array[const[0, int64], 32], 0:10]
    67  } [packed]
    68  
    69  type elf_hdr[ADDR, PHENTSIZE] {
    70  	e_ident0	const[0x7f, int8]
    71  	e_ident1	const[0x45, int8]
    72  	e_ident2	const[0x4c, int8]
    73  	e_ident3	const[0x46, int8]
    74  	e_ident_class	int8
    75  	e_ident_data	int8
    76  	e_ident_ver	int8
    77  	e_ident_osabi	int8
    78  	e_ident_pad	int64
    79  	e_type		flags[elf_types, int16]
    80  	e_machine	flags[elf_machines, int16]
    81  	e_version	int32
    82  	e_entry		ADDR[0:1000]
    83  	e_phoff		bytesize[parent, ADDR]
    84  	e_shoff		ADDR[0:1000]
    85  	e_flags		int32
    86  	e_ehsize	int16
    87  	e_phentsize	const[PHENTSIZE, int16]
    88  	e_phnum		int16[1:2]
    89  	e_shentsize	int16
    90  	e_shnum		int16
    91  	e_shstrndx	int16
    92  }
    93  
    94  elf32_phdr {
    95  	p_type		flags[elf_ptypes, int32]
    96  	p_offset	int32
    97  	p_vaddr		int32
    98  	p_paddr		int32
    99  	p_filesz	int32
   100  	p_memsz		int32
   101  	p_flags		int32
   102  	p_align		int32
   103  } [size[ELF32_PHDR_SIZE]]
   104  
   105  elf64_phdr {
   106  	p_type		flags[elf_ptypes, int32]
   107  	p_flags		int32
   108  	p_offset	int64
   109  	p_vaddr		int64
   110  	p_paddr		int64
   111  	p_filesz	int64
   112  	p_memsz		int64
   113  	p_align		int64
   114  } [size[ELF64_PHDR_SIZE]]
   115  
   116  elf_types = ET_EXEC, ET_DYN
   117  elf_machines = EM_386, EM_486, EM_X86_64
   118  elf_ptypes = PT_LOAD, PT_DYNAMIC, PT_INTERP, PT_NOTE, PT_SHLIB, PT_PHDR, PT_TLS, PT_LOOS, PT_LOPROC, PT_GNU_STACK
   119  
   120  define ELF32_PHDR_SIZE	sizeof(struct elf32_phdr)
   121  define ELF64_PHDR_SIZE	sizeof(struct elf64_phdr)