1## Check that program headers are output correctly 2 3# RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t32.elf 4# RUN: llvm-objdump --private-headers %t32.elf | FileCheck %s --check-prefixes=ELF32 5 6# ELF32: Program Header: 7# ELF32-NEXT: PHDR off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 8# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags -w- 9# ELF32-NEXT: PHDR off 0x00000317 vaddr 0x00002000 paddr 0x00002000 align 2**0 10# ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x 11# ELF32-NEXT: UNKNOWN off 0x00000317 vaddr 0x00002000 paddr 0x00002000 align 2**0 12# ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x 13# ELF32-NEXT: DYNAMIC off 0x00000324 vaddr 0x00006000 paddr 0x00006000 align 2**0 14# ELF32-NEXT: filesz 0x00000010 memsz 0x00000010 flags rwx 15# ELF32-NEXT: INTERP off 0x0000031e vaddr 0x00003000 paddr 0x00003000 align 2**0 16# ELF32-NEXT: filesz 0x00000004 memsz 0x00000004 flags rw- 17# ELF32-NEXT: NOTE off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 18# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 19# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 20# ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags --- 21# ELF32-NEXT: TLS off 0x00000322 vaddr 0x00004000 paddr 0x00004000 align 2**0 22# ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags --- 23# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 24# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 25# ELF32-NEXT:EH_FRAME off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 26# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 27# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 28# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 29# ELF32-NEXT: STACK off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 30# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 31# ELF32-NEXT: RELRO off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 32# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 33# ELF32-NEXT:PROPERTY off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 34# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 35# ELF32-NEXT: OPENBSD_RANDOMIZE off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 36# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 37# ELF32-NEXT: OPENBSD_WXNEEDED off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 38# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 39# ELF32-NEXT: OPENBSD_BOOTDATA off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 40# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 41# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 42# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 43# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 44# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 45# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 46# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 47# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 48# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 49# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 50# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 51# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 52# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- 53# ELF32-EMPTY: 54 55# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t64.elf 56# RUN: llvm-objdump --private-headers %t64.elf | FileCheck %s --check-prefixes=ELF64 57 58# ELF64: Program Header: 59# ELF64-NEXT: PHDR off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 60# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags -w- 61# ELF64-NEXT: PHDR off 0x000000000000054b vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 62# ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x 63# ELF64-NEXT: UNKNOWN off 0x000000000000054b vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 64# ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x 65# ELF64-NEXT: DYNAMIC off 0x0000000000000558 vaddr 0x0000000000006000 paddr 0x0000000000006000 align 2**0 66# ELF64-NEXT: filesz 0x0000000000000020 memsz 0x0000000000000020 flags rwx 67# ELF64-NEXT: INTERP off 0x0000000000000552 vaddr 0x0000000000003000 paddr 0x0000000000003000 align 2**0 68# ELF64-NEXT: filesz 0x0000000000000004 memsz 0x0000000000000004 flags rw- 69# ELF64-NEXT: NOTE off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 70# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 71# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 72# ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags --- 73# ELF64-NEXT: TLS off 0x0000000000000556 vaddr 0x0000000000004000 paddr 0x0000000000004000 align 2**0 74# ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags --- 75# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 76# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 77# ELF64-NEXT:EH_FRAME off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 78# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 79# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 80# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 81# ELF64-NEXT: STACK off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 82# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 83# ELF64-NEXT: RELRO off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 84# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 85# ELF64-NEXT: PROPERTY off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 86# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 87# ELF64-NEXT: OPENBSD_RANDOMIZE off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 88# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 89# ELF64-NEXT: OPENBSD_WXNEEDED off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 90# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 91# ELF64-NEXT: OPENBSD_BOOTDATA off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 92# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 93# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 94# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 95# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 96# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 97# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 98# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 99# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 100# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 101# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 102# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 103# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 104# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- 105# ELF64-EMPTY: 106 107--- !ELF 108FileHeader: 109 Class: ELFCLASS[[BITS]] 110 Data: ELFDATA2LSB 111 Type: ET_EXEC 112 Machine: [[MACHINE]] 113Sections: 114 - Name: .foo.begin 115 Type: SHT_PROGBITS 116 Flags: [ SHF_ALLOC ] 117 Address: 0x1000 118 Size: 0x1 119 - Name: .foo.end 120 Type: SHT_PROGBITS 121 Flags: [ SHF_ALLOC ] 122 Size: 0x2 123 - Name: .bar.begin 124 Type: SHT_PROGBITS 125 Flags: [ SHF_ALLOC ] 126 Address: 0x2000 127 Size: 0x3 128 - Name: .bar.end 129 Type: SHT_PROGBITS 130 Flags: [ SHF_ALLOC ] 131 Size: 0x4 132 - Name: .interp 133 Type: SHT_PROGBITS 134 Flags: [ SHF_ALLOC ] 135 Address: 0x3000 136 Content: "41424300" ## "ABC" 137 - Name: .tls 138 Type: SHT_PROGBITS 139 Flags: [ SHF_ALLOC, SHF_TLS ] 140 Address: 0x4000 141 Size: 0x1 142 - Name: .unused 143 Type: SHT_PROGBITS 144 Flags: [ SHF_ALLOC, SHF_TLS ] 145 Address: 0x5000 146 Size: 0x1 147 - Name: .dynamic 148 Type: SHT_DYNAMIC 149 Flags: [ SHF_ALLOC ] 150 Address: 0x6000 151 Entries: 152 - Tag: DT_NEEDED 153 Value: 0x1 154 - Tag: DT_NULL 155 Value: 0x0 156ProgramHeaders: 157## Case 1: an arbitrary segment with sections. 158 - Type: PT_PHDR 159 Flags: [ PF_W ] 160 VAddr: 0x1000 161 FirstSec: .foo.begin 162 LastSec: .foo.end 163## Case 2: another segment with different sections. 164 - Type: PT_PHDR 165 Flags: [ PF_X ] 166 VAddr: 0x2000 167 FirstSec: .bar.begin 168 LastSec: .bar.end 169## Case 3: the PT_NULL segment. 170 - Type: PT_NULL 171 Flags: [ PF_X ] 172 VAddr: 0x2000 173 FirstSec: .bar.begin 174 LastSec: .bar.end 175## Case 4: the PT_DYNAMIC segment. 176 - Type: PT_DYNAMIC 177 Flags: [ PF_R, PF_W, PF_X ] 178 VAddr: 0x6000 179 FirstSec: .dynamic 180 LastSec: .dynamic 181## Case 5: the PT_INTERP segment. 182 - Type: PT_INTERP 183 Flags: [ PF_R, PF_W ] 184 VAddr: 0x3000 185 FirstSec: .interp 186 LastSec: .interp 187## Case 6: the PT_NOTE segment. 188 - Type: PT_NOTE 189 VAddr: 0x1000 190 FirstSec: .foo.begin 191 LastSec: .foo.end 192## Case 7: the PT_SHLIB segment. 193 - Type: PT_SHLIB 194 VAddr: 0x1000 195 FirstSec: .foo.begin 196 LastSec: .foo.begin 197## Case 8: the PT_TLS segment. 198 - Type: PT_TLS 199 VAddr: 0x4000 200 FirstSec: .tls 201 LastSec: .tls 202## Case 9: the PT_LOOS segment. 203 - Type: 0x60000000 ## PT_LOOS 204 VAddr: 0x1000 205 FirstSec: .foo.begin 206 LastSec: .foo.end 207## Case 10: the PT_GNU_EH_FRAME segment. 208 - Type: PT_GNU_EH_FRAME 209 VAddr: 0x1000 210 FirstSec: .foo.begin 211 LastSec: .foo.end 212## Case 11: the PT_SUNW_UNWIND segment. 213 - Type: 0x6464e550 ## PT_SUNW_UNWIND 214 VAddr: 0x1000 215 FirstSec: .foo.begin 216 LastSec: .foo.end 217## Case 12: the PT_GNU_STACK segment. 218 - Type: PT_GNU_STACK 219 VAddr: 0x1000 220 FirstSec: .foo.begin 221 LastSec: .foo.end 222## Case 13: the PT_GNU_RELRO segment. 223 - Type: PT_GNU_RELRO 224 VAddr: 0x1000 225 FirstSec: .foo.begin 226 LastSec: .foo.end 227## Case 14: the PT_GNU_PROPERTY segment. 228 - Type: PT_GNU_PROPERTY 229 VAddr: 0x1000 230 FirstSec: .foo.begin 231 LastSec: .foo.end 232## Case 15: the PT_OPENBSD_RANDOMIZE segment. 233 - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE 234 VAddr: 0x1000 235 FirstSec: .foo.begin 236 LastSec: .foo.end 237## Case 16: the PT_OPENBSD_WXNEEDED segment. 238 - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED 239 VAddr: 0x1000 240 FirstSec: .foo.begin 241 LastSec: .foo.end 242## Case 17: the PT_OPENBSD_BOOTDATA segment. 243 - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA 244 VAddr: 0x1000 245 FirstSec: .foo.begin 246 LastSec: .foo.end 247## Case 18: the PT_HIOS segment. 248 - Type: 0x6fffffff ## PT_HIOS 249 VAddr: 0x1000 250 FirstSec: .foo.begin 251 LastSec: .foo.end 252## Case 19: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment. 253 - Type: 0x70000000 ## PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO 254 VAddr: 0x1000 255 FirstSec: .foo.begin 256 LastSec: .foo.end 257## Case 20: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment. 258 - Type: 0x70000001 ## PT_ARM_EXIDX, PT_MIPS_RTPROC 259 VAddr: 0x1000 260 FirstSec: .foo.begin 261 LastSec: .foo.end 262## Case 20: the PT_MIPS_OPTIONS segment. 263 - Type: 0x70000002 ## PT_MIPS_OPTIONS 264 VAddr: 0x1000 265 FirstSec: .foo.begin 266 LastSec: .foo.end 267## Case 21: the PT_MIPS_ABIFLAGS segment. 268 - Type: 0x70000003 ## PT_MIPS_ABIFLAGS 269 VAddr: 0x1000 270 FirstSec: .foo.begin 271 LastSec: .foo.end 272## Case 22: the PT_HIPROC segment. 273 - Type: 0x7fffffff ## PT_HIPROC 274 VAddr: 0x1000 275 FirstSec: .foo.begin 276 LastSec: .foo.end 277 278## Check we report an error / warning when we are unable to read program headers. 279## Case A: the e_phentsize field is invalid. 280# RUN: yaml2obj --docnum=2 -DPHENTSIZE=1 %s -o %t.phdr.err 281# RUN: not llvm-objdump --private-headers %t.phdr.err 2>&1 | \ 282# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=PHENTSIZE 283 284# PHENTSIZE: Program Header: 285# PHENTSIZE-NEXT: warning: '[[FILE]]': unable to read program headers: invalid e_phentsize: 1 286# PHENTSIZE-NEXT: error: '[[FILE]]': invalid e_phentsize: 1 287 288--- !ELF 289FileHeader: 290 Class: ELFCLASS64 291 Data: ELFDATA2LSB 292 Type: ET_EXEC 293 EPhEntSize: [[PHENTSIZE=<none>]] 294 EPhOff: [[PHOFF=<none>]] 295Sections: 296 - Name: .foo 297 Type: SHT_PROGBITS 298ProgramHeaders: 299 - Type: PT_PHDR 300 FirstSec: .foo 301 LastSec: .foo 302 303## Case B: the value of the e_phoff field is invalid. 304 305## Check that we do not report a warning when the program header table ends right before the end of the file. 306## 0x160 + size of headers (56) == file size. 307# RUN: yaml2obj --docnum=2 -DPHOFF=0x160 %s -o %t.phdr.no.err2 308# RUN: llvm-objdump %t.phdr.no.err2 --private-headers 2>&1 | FileCheck %s --implicit-check-not=warning: 309 310## Check we report a warning / error when e_phoff goes 1 byte past the end of the file. 311# RUN: yaml2obj --docnum=2 -DPHOFF=0x161 %s -o %t.phdr.err2 312# RUN: not llvm-objdump --private-headers %t.phdr.err2 2>&1 | \ 313# RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=PHOFF -DOFF=0x161 314 315# PHOFF: Program Header: 316# PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 317# PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 318 319 320## Check we report a warning / error when the value of e_phoff is so large that 321## e_phoff + e_phnum * e_phentsize > UINT64_MAX. 322# RUN: yaml2obj --docnum=2 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3 323# RUN: not llvm-objdump --private-headers %t.phdr.err3 2>&1 | \ 324# RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=PHOFF -DOFF=0xffffffffffffffff 325