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)