1## Check how we dump program headers and print sections to segments 2## mapping (llvm-readelf only) with -l, --program-headers and --segments options. 3 4## Check that -l, --program-headers and --segments are the same option. 5 6## Case A: test llvm-readelf tool. 7# RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t32.elf 8# RUN: llvm-readelf -l %t32.elf 2>&1 > %t.readelf-l.txt 9# RUN: llvm-readelf --program-headers %t32.elf 2>&1 > %t.readelf-pheaders.txt 10# RUN: cmp %t.readelf-l.txt %t.readelf-pheaders.txt 11# RUN: llvm-readelf --segments %t32.elf 2>&1 > %t.readelf-segments.txt 12# RUN: cmp %t.readelf-l.txt %t.readelf-segments.txt 13 14## Case B: test llvm-readobj tool. 15# RUN: llvm-readobj -l %t32.elf 2>&1 > %t.readobj-l.txt 16# RUN: llvm-readobj --program-headers %t32.elf 2>&1 > %t.readobj-pheaders.txt 17# RUN: cmp %t.readobj-l.txt %t.readobj-pheaders.txt 18# RUN: llvm-readobj --segments %t32.elf 2>&1 > %t.readobj-segments.txt 19# RUN: cmp %t.readobj-l.txt %t.readobj-segments.txt 20 21## Check we are able to print program headers of different types. 22# RUN: FileCheck %s --check-prefixes=ELF32,MAPPING \ 23# RUN: --match-full-lines --strict-whitespace --input-file=%t.readelf-l.txt 24# RUN: FileCheck %s --check-prefixes=ELF-LLVM,ELF32-LLVM \ 25# RUN: --match-full-lines --input-file=%t.readobj-l.txt 26 27# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t64.elf 28# RUN: llvm-readelf -l %t64.elf | \ 29# RUN: FileCheck %s --check-prefixes=ELF64,MAPPING --strict-whitespace --match-full-lines 30# RUN: llvm-readobj -l %t64.elf | FileCheck %s --check-prefixes=ELF-LLVM,ELF64-LLVM 31 32# ELF32:There are 23 program headers, starting at offset 52 33# ELF32-EMPTY: 34# ELF32-NEXT:Program Headers: 35# ELF32-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 36# ELF32-NEXT: PHDR 0x000314 0x00001000 0x00001000 0x00003 0x00003 W 0x1 37# ELF32-NEXT: PHDR 0x000317 0x00002000 0x00002000 0x00007 0x00007 E 0x1 38# ELF32-NEXT: NULL 0x000317 0x00002000 0x00002000 0x00007 0x00007 E 0x1 39# ELF32-NEXT: DYNAMIC 0x000314 0x00001000 0x00001000 0x00003 0x00003 RWE 0x1 40# ELF32-NEXT: INTERP 0x00031e 0x00003000 0x00003000 0x00004 0x00004 RW 0x1 41# ELF32-NEXT: [Requesting program interpreter: ABC] 42# ELF32-NEXT: NOTE 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 43# ELF32-NEXT: SHLIB 0x000314 0x00001000 0x00001000 0x00001 0x00001 0x1 44# ELF32-NEXT: TLS 0x000322 0x00004000 0x00004000 0x00001 0x00001 0x1 45# ELF32-NEXT: <unknown>: 0x60000000 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 46# ELF32-NEXT: GNU_EH_FRAME 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 47# ELF32-NEXT: SUNW_UNWIND 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 48# ELF32-NEXT: GNU_STACK 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 49# ELF32-NEXT: GNU_RELRO 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 50# ELF32-NEXT: GNU_PROPERTY 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 51# ELF32-NEXT: OPENBSD_RANDOMIZE 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 52# ELF32-NEXT: OPENBSD_WXNEEDED 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 53# ELF32-NEXT: OPENBSD_BOOTDATA 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 54# ELF32-NEXT: <unknown>: 0x6fffffff 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 55# ELF32-NEXT: <unknown>: 0x70000000 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 56# ELF32-NEXT: <unknown>: 0x70000001 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 57# ELF32-NEXT: <unknown>: 0x70000002 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 58# ELF32-NEXT: <unknown>: 0x70000003 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 59# ELF32-NEXT: <unknown>: 0x7fffffff 0x000314 0x00001000 0x00001000 0x00003 0x00003 0x1 60# ELF32-EMPTY: 61 62# ELF64:There are 23 program headers, starting at offset 64 63# ELF64-EMPTY: 64# ELF64-NEXT:Program Headers: 65# ELF64-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 66# ELF64-NEXT: PHDR 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 W 0x1 67# ELF64-NEXT: PHDR 0x00054b 0x0000000000002000 0x0000000000002000 0x000007 0x000007 E 0x1 68# ELF64-NEXT: NULL 0x00054b 0x0000000000002000 0x0000000000002000 0x000007 0x000007 E 0x1 69# ELF64-NEXT: DYNAMIC 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 RWE 0x1 70# ELF64-NEXT: INTERP 0x000552 0x0000000000003000 0x0000000000003000 0x000004 0x000004 RW 0x1 71# ELF64-NEXT: [Requesting program interpreter: ABC] 72# ELF64-NEXT: NOTE 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 73# ELF64-NEXT: SHLIB 0x000548 0x0000000000001000 0x0000000000001000 0x000001 0x000001 0x1 74# ELF64-NEXT: TLS 0x000556 0x0000000000004000 0x0000000000004000 0x000001 0x000001 0x1 75# ELF64-NEXT: <unknown>: 0x60000000 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 76# ELF64-NEXT: GNU_EH_FRAME 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 77# ELF64-NEXT: SUNW_UNWIND 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 78# ELF64-NEXT: GNU_STACK 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 79# ELF64-NEXT: GNU_RELRO 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 80# ELF64-NEXT: GNU_PROPERTY 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 81# ELF64-NEXT: OPENBSD_RANDOMIZE 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 82# ELF64-NEXT: OPENBSD_WXNEEDED 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 83# ELF64-NEXT: OPENBSD_BOOTDATA 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 84# ELF64-NEXT: <unknown>: 0x6fffffff 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 85# ELF64-NEXT: <unknown>: 0x70000000 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 86# ELF64-NEXT: <unknown>: 0x70000001 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 87# ELF64-NEXT: <unknown>: 0x70000002 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 88# ELF64-NEXT: <unknown>: 0x70000003 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 89# ELF64-NEXT: <unknown>: 0x7fffffff 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 90# ELF64-EMPTY: 91 92# MAPPING: Section to Segment mapping: 93# MAPPING-NEXT: Segment Sections... 94# MAPPING-NEXT: 00 .foo.begin .foo.end {{$}} 95# MAPPING-NEXT: 01 .bar.begin .bar.end {{$}} 96# MAPPING-NEXT: 02 .bar.begin .bar.end {{$}} 97# MAPPING-NEXT: 03 .foo.begin .foo.end {{$}} 98# MAPPING-NEXT: 04 .interp {{$}} 99# MAPPING-NEXT: 05 .foo.begin .foo.end {{$}} 100# MAPPING-NEXT: 06 .foo.begin {{$}} 101# MAPPING-NEXT: 07 .tls {{$}} 102# MAPPING-NEXT: 08 .foo.begin .foo.end {{$}} 103# MAPPING-NEXT: 09 .foo.begin .foo.end {{$}} 104# MAPPING-NEXT: 10 .foo.begin .foo.end {{$}} 105# MAPPING-NEXT: 11 .foo.begin .foo.end {{$}} 106# MAPPING-NEXT: 12 .foo.begin .foo.end {{$}} 107# MAPPING-NEXT: 13 .foo.begin .foo.end {{$}} 108# MAPPING-NEXT: 14 .foo.begin .foo.end {{$}} 109# MAPPING-NEXT: 15 .foo.begin .foo.end {{$}} 110# MAPPING-NEXT: 16 .foo.begin .foo.end {{$}} 111# MAPPING-NEXT: 17 .foo.begin .foo.end {{$}} 112# MAPPING-NEXT: 18 .foo.begin .foo.end {{$}} 113# MAPPING-NEXT: 19 .foo.begin .foo.end {{$}} 114# MAPPING-NEXT: 20 .foo.begin .foo.end {{$}} 115# MAPPING-NEXT: 21 .foo.begin .foo.end {{$}} 116# MAPPING-NEXT: 22 .foo.begin .foo.end {{$}} 117# MAPPING-NEXT: None .unused .strtab .shstrtab {{$}} 118 119# ELF-LLVM: ProgramHeaders [ 120# ELF-LLVM-NEXT: ProgramHeader { 121# ELF-LLVM-NEXT: Type: PT_PHDR (0x6) 122# ELF32-LLVM-NEXT: Offset: 0x314 123# ELF64-LLVM-NEXT: Offset: 0x548 124# ELF-LLVM-NEXT: VirtualAddress: 0x1000 125# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 126# ELF-LLVM-NEXT: FileSize: 3 127# ELF-LLVM-NEXT: MemSize: 3 128# ELF-LLVM-NEXT: Flags [ (0x2) 129# ELF-LLVM-NEXT: PF_W (0x2) 130# ELF-LLVM-NEXT: ] 131# ELF-LLVM-NEXT: Alignment: 1 132# ELF-LLVM-NEXT: } 133# ELF-LLVM-NEXT: ProgramHeader { 134# ELF-LLVM-NEXT: Type: PT_PHDR (0x6) 135# ELF32-LLVM-NEXT: Offset: 0x317 136# ELF64-LLVM-NEXT: Offset: 0x54B 137# ELF-LLVM-NEXT: VirtualAddress: 0x2000 138# ELF-LLVM-NEXT: PhysicalAddress: 0x2000 139# ELF-LLVM-NEXT: FileSize: 7 140# ELF-LLVM-NEXT: MemSize: 7 141# ELF-LLVM-NEXT: Flags [ (0x1) 142# ELF-LLVM-NEXT: PF_X (0x1) 143# ELF-LLVM-NEXT: ] 144# ELF-LLVM-NEXT: Alignment: 1 145# ELF-LLVM-NEXT: } 146# ELF-LLVM-NEXT: ProgramHeader { 147# ELF-LLVM-NEXT: Type: PT_NULL (0x0) 148# ELF32-LLVM-NEXT: Offset: 0x317 149# ELF64-LLVM-NEXT: Offset: 0x54B 150# ELF-LLVM-NEXT: VirtualAddress: 0x2000 151# ELF-LLVM-NEXT: PhysicalAddress: 0x2000 152# ELF-LLVM-NEXT: FileSize: 7 153# ELF-LLVM-NEXT: MemSize: 7 154# ELF-LLVM-NEXT: Flags [ (0x1) 155# ELF-LLVM-NEXT: PF_X (0x1) 156# ELF-LLVM-NEXT: ] 157# ELF-LLVM-NEXT: Alignment: 1 158# ELF-LLVM-NEXT: } 159# ELF-LLVM-NEXT: ProgramHeader { 160# ELF-LLVM-NEXT: Type: PT_DYNAMIC (0x2) 161# ELF32-LLVM-NEXT: Offset: 0x314 162# ELF64-LLVM-NEXT: Offset: 0x548 163# ELF-LLVM-NEXT: VirtualAddress: 0x1000 164# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 165# ELF-LLVM-NEXT: FileSize: 3 166# ELF-LLVM-NEXT: MemSize: 3 167# ELF-LLVM-NEXT: Flags [ (0x7) 168# ELF-LLVM-NEXT: PF_R (0x4) 169# ELF-LLVM-NEXT: PF_W (0x2) 170# ELF-LLVM-NEXT: PF_X (0x1) 171# ELF-LLVM-NEXT: ] 172# ELF-LLVM-NEXT: Alignment: 1 173# ELF-LLVM-NEXT: } 174# ELF-LLVM-NEXT: ProgramHeader { 175# ELF-LLVM-NEXT: Type: PT_INTERP (0x3) 176# ELF32-LLVM-NEXT: Offset: 0x31E 177# ELF64-LLVM-NEXT: Offset: 0x552 178# ELF-LLVM-NEXT: VirtualAddress: 0x3000 179# ELF-LLVM-NEXT: PhysicalAddress: 0x3000 180# ELF-LLVM-NEXT: FileSize: 4 181# ELF-LLVM-NEXT: MemSize: 4 182# ELF-LLVM-NEXT: Flags [ (0x6) 183# ELF-LLVM-NEXT: PF_R (0x4) 184# ELF-LLVM-NEXT: PF_W (0x2) 185# ELF-LLVM-NEXT: ] 186# ELF-LLVM-NEXT: Alignment: 1 187# ELF-LLVM-NEXT: } 188# ELF-LLVM-NEXT: ProgramHeader { 189# ELF-LLVM-NEXT: Type: PT_NOTE (0x4) 190# ELF32-LLVM-NEXT: Offset: 0x314 191# ELF64-LLVM-NEXT: Offset: 0x548 192# ELF-LLVM-NEXT: VirtualAddress: 0x1000 193# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 194# ELF-LLVM-NEXT: FileSize: 3 195# ELF-LLVM-NEXT: MemSize: 3 196# ELF-LLVM-NEXT: Flags [ (0x0) 197# ELF-LLVM-NEXT: ] 198# ELF-LLVM-NEXT: Alignment: 1 199# ELF-LLVM-NEXT: } 200# ELF-LLVM-NEXT: ProgramHeader { 201# ELF-LLVM-NEXT: Type: PT_SHLIB (0x5) 202# ELF32-LLVM-NEXT: Offset: 0x314 203# ELF64-LLVM-NEXT: Offset: 0x548 204# ELF-LLVM-NEXT: VirtualAddress: 0x1000 205# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 206# ELF-LLVM-NEXT: FileSize: 1 207# ELF-LLVM-NEXT: MemSize: 1 208# ELF-LLVM-NEXT: Flags [ (0x0) 209# ELF-LLVM-NEXT: ] 210# ELF-LLVM-NEXT: Alignment: 1 211# ELF-LLVM-NEXT: } 212# ELF-LLVM-NEXT: ProgramHeader { 213# ELF-LLVM-NEXT: Type: PT_TLS (0x7) 214# ELF32-LLVM-NEXT: Offset: 0x322 215# ELF64-LLVM-NEXT: Offset: 0x556 216# ELF-LLVM-NEXT: VirtualAddress: 0x4000 217# ELF-LLVM-NEXT: PhysicalAddress: 0x4000 218# ELF-LLVM-NEXT: FileSize: 1 219# ELF-LLVM-NEXT: MemSize: 1 220# ELF-LLVM-NEXT: Flags [ (0x0) 221# ELF-LLVM-NEXT: ] 222# ELF-LLVM-NEXT: Alignment: 1 223# ELF-LLVM-NEXT: } 224# ELF-LLVM-NEXT: ProgramHeader { 225# ELF-LLVM-NEXT: Type: Unknown (0x60000000) 226# ELF32-LLVM-NEXT: Offset: 0x314 227# ELF64-LLVM-NEXT: Offset: 0x548 228# ELF-LLVM-NEXT: VirtualAddress: 0x1000 229# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 230# ELF-LLVM-NEXT: FileSize: 3 231# ELF-LLVM-NEXT: MemSize: 3 232# ELF-LLVM-NEXT: Flags [ (0x0) 233# ELF-LLVM-NEXT: ] 234# ELF-LLVM-NEXT: Alignment: 1 235# ELF-LLVM-NEXT: } 236# ELF-LLVM-NEXT: ProgramHeader { 237# ELF-LLVM-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550) 238# ELF32-LLVM-NEXT: Offset: 0x314 239# ELF64-LLVM-NEXT: Offset: 0x548 240# ELF-LLVM-NEXT: VirtualAddress: 0x1000 241# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 242# ELF-LLVM-NEXT: FileSize: 3 243# ELF-LLVM-NEXT: MemSize: 3 244# ELF-LLVM-NEXT: Flags [ (0x0) 245# ELF-LLVM-NEXT: ] 246# ELF-LLVM-NEXT: Alignment: 1 247# ELF-LLVM-NEXT: } 248# ELF-LLVM-NEXT: ProgramHeader { 249# ELF-LLVM-NEXT: Type: PT_SUNW_UNWIND (0x6464E550) 250# ELF32-LLVM-NEXT: Offset: 0x314 251# ELF64-LLVM-NEXT: Offset: 0x548 252# ELF-LLVM-NEXT: VirtualAddress: 0x1000 253# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 254# ELF-LLVM-NEXT: FileSize: 3 255# ELF-LLVM-NEXT: MemSize: 3 256# ELF-LLVM-NEXT: Flags [ (0x0) 257# ELF-LLVM-NEXT: ] 258# ELF-LLVM-NEXT: Alignment: 1 259# ELF-LLVM-NEXT: } 260# ELF-LLVM-NEXT: ProgramHeader { 261# ELF-LLVM-NEXT: Type: PT_GNU_STACK (0x6474E551) 262# ELF32-LLVM-NEXT: Offset: 0x314 263# ELF64-LLVM-NEXT: Offset: 0x548 264# ELF-LLVM-NEXT: VirtualAddress: 0x1000 265# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 266# ELF-LLVM-NEXT: FileSize: 3 267# ELF-LLVM-NEXT: MemSize: 3 268# ELF-LLVM-NEXT: Flags [ (0x0) 269# ELF-LLVM-NEXT: ] 270# ELF-LLVM-NEXT: Alignment: 1 271# ELF-LLVM-NEXT: } 272# ELF-LLVM-NEXT: ProgramHeader { 273# ELF-LLVM-NEXT: Type: PT_GNU_RELRO (0x6474E552) 274# ELF32-LLVM-NEXT: Offset: 0x314 275# ELF64-LLVM-NEXT: Offset: 0x548 276# ELF-LLVM-NEXT: VirtualAddress: 0x1000 277# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 278# ELF-LLVM-NEXT: FileSize: 3 279# ELF-LLVM-NEXT: MemSize: 3 280# ELF-LLVM-NEXT: Flags [ (0x0) 281# ELF-LLVM-NEXT: ] 282# ELF-LLVM-NEXT: Alignment: 1 283# ELF-LLVM-NEXT: } 284# ELF-LLVM-NEXT: ProgramHeader { 285# ELF-LLVM-NEXT: Type: PT_GNU_PROPERTY (0x6474E553) 286# ELF32-LLVM-NEXT: Offset: 0x314 287# ELF64-LLVM-NEXT: Offset: 0x548 288# ELF-LLVM-NEXT: VirtualAddress: 0x1000 289# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 290# ELF-LLVM-NEXT: FileSize: 3 291# ELF-LLVM-NEXT: MemSize: 3 292# ELF-LLVM-NEXT: Flags [ (0x0) 293# ELF-LLVM-NEXT: ] 294# ELF-LLVM-NEXT: Alignment: 1 295# ELF-LLVM-NEXT: } 296# ELF-LLVM-NEXT: ProgramHeader { 297# ELF-LLVM-NEXT: Type: PT_OPENBSD_RANDOMIZE (0x65A3DBE6) 298# ELF32-LLVM-NEXT: Offset: 0x314 299# ELF64-LLVM-NEXT: Offset: 0x548 300# ELF-LLVM-NEXT: VirtualAddress: 0x1000 301# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 302# ELF-LLVM-NEXT: FileSize: 3 303# ELF-LLVM-NEXT: MemSize: 3 304# ELF-LLVM-NEXT: Flags [ (0x0) 305# ELF-LLVM-NEXT: ] 306# ELF-LLVM-NEXT: Alignment: 1 307# ELF-LLVM-NEXT: } 308# ELF-LLVM-NEXT: ProgramHeader { 309# ELF-LLVM-NEXT: Type: PT_OPENBSD_WXNEEDED (0x65A3DBE7) 310# ELF32-LLVM-NEXT: Offset: 0x314 311# ELF64-LLVM-NEXT: Offset: 0x548 312# ELF-LLVM-NEXT: VirtualAddress: 0x1000 313# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 314# ELF-LLVM-NEXT: FileSize: 3 315# ELF-LLVM-NEXT: MemSize: 3 316# ELF-LLVM-NEXT: Flags [ (0x0) 317# ELF-LLVM-NEXT: ] 318# ELF-LLVM-NEXT: Alignment: 1 319# ELF-LLVM-NEXT: } 320# ELF-LLVM-NEXT: ProgramHeader { 321# ELF-LLVM-NEXT: Type: PT_OPENBSD_BOOTDATA (0x65A41BE6) 322# ELF32-LLVM-NEXT: Offset: 0x314 323# ELF64-LLVM-NEXT: Offset: 0x548 324# ELF-LLVM-NEXT: VirtualAddress: 0x1000 325# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 326# ELF-LLVM-NEXT: FileSize: 3 327# ELF-LLVM-NEXT: MemSize: 3 328# ELF-LLVM-NEXT: Flags [ (0x0) 329# ELF-LLVM-NEXT: ] 330# ELF-LLVM-NEXT: Alignment: 1 331# ELF-LLVM-NEXT: } 332# ELF-LLVM-NEXT: ProgramHeader { 333# ELF-LLVM-NEXT: Type: Unknown (0x6FFFFFFF) 334# ELF32-LLVM-NEXT: Offset: 0x314 335# ELF64-LLVM-NEXT: Offset: 0x548 336# ELF-LLVM-NEXT: VirtualAddress: 0x1000 337# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 338# ELF-LLVM-NEXT: FileSize: 3 339# ELF-LLVM-NEXT: MemSize: 3 340# ELF-LLVM-NEXT: Flags [ (0x0) 341# ELF-LLVM-NEXT: ] 342# ELF-LLVM-NEXT: Alignment: 1 343# ELF-LLVM-NEXT: } 344# ELF-LLVM-NEXT: ProgramHeader { 345# ELF-LLVM-NEXT: Type: Unknown (0x70000000) 346# ELF32-LLVM-NEXT: Offset: 0x314 347# ELF64-LLVM-NEXT: Offset: 0x548 348# ELF-LLVM-NEXT: VirtualAddress: 0x1000 349# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 350# ELF-LLVM-NEXT: FileSize: 3 351# ELF-LLVM-NEXT: MemSize: 3 352# ELF-LLVM-NEXT: Flags [ (0x0) 353# ELF-LLVM-NEXT: ] 354# ELF-LLVM-NEXT: Alignment: 1 355# ELF-LLVM-NEXT: } 356# ELF-LLVM-NEXT: ProgramHeader { 357# ELF-LLVM-NEXT: Type: Unknown (0x70000001) 358# ELF32-LLVM-NEXT: Offset: 0x314 359# ELF64-LLVM-NEXT: Offset: 0x548 360# ELF-LLVM-NEXT: VirtualAddress: 0x1000 361# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 362# ELF-LLVM-NEXT: FileSize: 3 363# ELF-LLVM-NEXT: MemSize: 3 364# ELF-LLVM-NEXT: Flags [ (0x0) 365# ELF-LLVM-NEXT: ] 366# ELF-LLVM-NEXT: Alignment: 1 367# ELF-LLVM-NEXT: } 368# ELF-LLVM-NEXT: ProgramHeader { 369# ELF-LLVM-NEXT: Type: Unknown (0x70000002) 370# ELF32-LLVM-NEXT: Offset: 0x314 371# ELF64-LLVM-NEXT: Offset: 0x548 372# ELF-LLVM-NEXT: VirtualAddress: 0x1000 373# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 374# ELF-LLVM-NEXT: FileSize: 3 375# ELF-LLVM-NEXT: MemSize: 3 376# ELF-LLVM-NEXT: Flags [ (0x0) 377# ELF-LLVM-NEXT: ] 378# ELF-LLVM-NEXT: Alignment: 1 379# ELF-LLVM-NEXT: } 380# ELF-LLVM-NEXT: ProgramHeader { 381# ELF-LLVM-NEXT: Type: Unknown (0x70000003) 382# ELF32-LLVM-NEXT: Offset: 0x314 383# ELF64-LLVM-NEXT: Offset: 0x548 384# ELF-LLVM-NEXT: VirtualAddress: 0x1000 385# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 386# ELF-LLVM-NEXT: FileSize: 3 387# ELF-LLVM-NEXT: MemSize: 3 388# ELF-LLVM-NEXT: Flags [ (0x0) 389# ELF-LLVM-NEXT: ] 390# ELF-LLVM-NEXT: Alignment: 1 391# ELF-LLVM-NEXT: } 392# ELF-LLVM-NEXT: ProgramHeader { 393# ELF-LLVM-NEXT: Type: Unknown (0x7FFFFFFF) 394# ELF32-LLVM-NEXT: Offset: 0x314 395# ELF64-LLVM-NEXT: Offset: 0x548 396# ELF-LLVM-NEXT: VirtualAddress: 0x1000 397# ELF-LLVM-NEXT: PhysicalAddress: 0x1000 398# ELF-LLVM-NEXT: FileSize: 3 399# ELF-LLVM-NEXT: MemSize: 3 400# ELF-LLVM-NEXT: Flags [ (0x0) 401# ELF-LLVM-NEXT: ] 402# ELF-LLVM-NEXT: Alignment: 1 403# ELF-LLVM-NEXT: } 404# ELF-LLVM-NEXT: ] 405 406--- !ELF 407FileHeader: 408 Class: ELFCLASS[[BITS]] 409 Data: ELFDATA2LSB 410 Type: ET_EXEC 411 Machine: [[MACHINE]] 412Sections: 413 - Name: .foo.begin 414 Type: SHT_PROGBITS 415 Flags: [ SHF_ALLOC ] 416 Address: 0x1000 417 Size: 0x1 418 - Name: .foo.end 419 Type: SHT_PROGBITS 420 Flags: [ SHF_ALLOC ] 421 Size: 0x2 422 - Name: .bar.begin 423 Type: SHT_PROGBITS 424 Flags: [ SHF_ALLOC ] 425 Address: 0x2000 426 Size: 0x3 427 - Name: .bar.end 428 Type: SHT_PROGBITS 429 Flags: [ SHF_ALLOC ] 430 Size: 0x4 431 - Name: .interp 432 Type: SHT_PROGBITS 433 Flags: [ SHF_ALLOC ] 434 Address: 0x3000 435 Content: "41424300" ## "ABC" 436 - Name: .tls 437 Type: SHT_PROGBITS 438 Flags: [ SHF_ALLOC, SHF_TLS ] 439 Address: 0x4000 440 Size: 0x1 441 - Name: .unused 442 Type: SHT_PROGBITS 443 Flags: [ SHF_ALLOC, SHF_TLS ] 444 Address: 0x5000 445 Size: 0x1 446ProgramHeaders: 447## Case 1: an arbitrary segment with sections. 448 - Type: PT_PHDR 449 Flags: [ PF_W ] 450 VAddr: 0x1000 451 FirstSec: .foo.begin 452 LastSec: .foo.end 453## Case 2: another segment with different sections. 454 - Type: PT_PHDR 455 Flags: [ PF_X ] 456 VAddr: 0x2000 457 FirstSec: .bar.begin 458 LastSec: .bar.end 459## Case 3: the PT_NULL segment. 460 - Type: PT_NULL 461 Flags: [ PF_X ] 462 VAddr: 0x2000 463 FirstSec: .bar.begin 464 LastSec: .bar.end 465## Case 4: the PT_DYNAMIC segment. 466 - Type: PT_DYNAMIC 467 Flags: [ PF_R, PF_W, PF_X ] 468 VAddr: 0x1000 469 FirstSec: .foo.begin 470 LastSec: .foo.end 471## Case 5: the PT_INTERP segment. 472 - Type: PT_INTERP 473 Flags: [ PF_R, PF_W ] 474 VAddr: 0x3000 475 FirstSec: .interp 476 LastSec: .interp 477## Case 6: the PT_NOTE segment. 478 - Type: PT_NOTE 479 VAddr: 0x1000 480 FirstSec: .foo.begin 481 LastSec: .foo.end 482## Case 7: the PT_SHLIB segment. 483 - Type: PT_SHLIB 484 VAddr: 0x1000 485 FirstSec: .foo.begin 486 LastSec: .foo.begin 487## Case 8: the PT_TLS segment. 488 - Type: PT_TLS 489 VAddr: 0x4000 490 FirstSec: .tls 491 LastSec: .tls 492## Case 9: the PT_LOOS segment. 493 - Type: 0x60000000 ## PT_LOOS 494 VAddr: 0x1000 495 FirstSec: .foo.begin 496 LastSec: .foo.end 497## Case 10: the PT_GNU_EH_FRAME segment. 498 - Type: PT_GNU_EH_FRAME 499 VAddr: 0x1000 500 FirstSec: .foo.begin 501 LastSec: .foo.end 502## Case 11: the PT_SUNW_UNWIND segment. 503 - Type: 0x6464e550 ## PT_SUNW_UNWIND 504 VAddr: 0x1000 505 FirstSec: .foo.begin 506 LastSec: .foo.end 507## Case 12: the PT_GNU_STACK segment. 508 - Type: PT_GNU_STACK 509 VAddr: 0x1000 510 FirstSec: .foo.begin 511 LastSec: .foo.end 512## Case 13: the PT_GNU_RELRO segment. 513 - Type: PT_GNU_RELRO 514 VAddr: 0x1000 515 FirstSec: .foo.begin 516 LastSec: .foo.end 517## Case 14: the PT_GNU_PROPERTY segment. 518 - Type: PT_GNU_PROPERTY 519 VAddr: 0x1000 520 FirstSec: .foo.begin 521 LastSec: .foo.end 522## Case 15: the PT_OPENBSD_RANDOMIZE segment. 523 - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE 524 VAddr: 0x1000 525 FirstSec: .foo.begin 526 LastSec: .foo.end 527## Case 16: the PT_OPENBSD_WXNEEDED segment. 528 - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED 529 VAddr: 0x1000 530 FirstSec: .foo.begin 531 LastSec: .foo.end 532## Case 17: the PT_OPENBSD_BOOTDATA segment. 533 - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA 534 VAddr: 0x1000 535 FirstSec: .foo.begin 536 LastSec: .foo.end 537## Case 18: the PT_HIOS segment. 538 - Type: 0x6fffffff ## PT_HIOS 539 VAddr: 0x1000 540 FirstSec: .foo.begin 541 LastSec: .foo.end 542## Case 19: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment. 543 - Type: 0x70000000 ## PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO 544 VAddr: 0x1000 545 FirstSec: .foo.begin 546 LastSec: .foo.end 547## Case 20: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment. 548 - Type: 0x70000001 ## PT_ARM_EXIDX, PT_MIPS_RTPROC 549 VAddr: 0x1000 550 FirstSec: .foo.begin 551 LastSec: .foo.end 552## Case 20: the PT_MIPS_OPTIONS segment. 553 - Type: 0x70000002 ## PT_MIPS_OPTIONS 554 VAddr: 0x1000 555 FirstSec: .foo.begin 556 LastSec: .foo.end 557## Case 21: the PT_MIPS_ABIFLAGS/PT_RISCV_ATTRIBUTES segment. 558 - Type: 0x70000003 ## PT_MIPS_ABIFLAGS/PT_RISCV_ATTRIBUTES 559 VAddr: 0x1000 560 FirstSec: .foo.begin 561 LastSec: .foo.end 562## Case 22: the PT_HIPROC segment. 563 - Type: 0x7fffffff ## PT_HIPROC 564 VAddr: 0x1000 565 FirstSec: .foo.begin 566 LastSec: .foo.end 567 568## Check how we dump ARM specific program headers. 569# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_ARM %s -o %tarm.elf 570# RUN: llvm-readelf --program-headers %tarm.elf | FileCheck %s --check-prefix=ARM-GNU 571# RUN: llvm-readobj --program-headers %tarm.elf | FileCheck %s --check-prefix=ARM-LLVM 572 573# ARM-GNU: <unknown>: 0x70000000 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 574# ARM-GNU-NEXT: EXIDX 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 575# ARM-GNU-NEXT: <unknown>: 0x70000002 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 576 577# ARM-LLVM: ProgramHeader { 578# ARM-LLVM: Type: Unknown (0x70000000) 579# ARM-LLVM: ProgramHeader { 580# ARM-LLVM-NEXT: Type: PT_ARM_EXIDX (0x70000001) 581# ARM-LLVM: ProgramHeader { 582# ARM-LLVM-NEXT: Type: Unknown (0x70000002) 583 584## Check how we dump MIPS specific program headers. 585# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_MIPS %s -o %tmips.elf 586# RUN: llvm-readelf --program-headers %tmips.elf | FileCheck %s --check-prefix=MIPS-GNU 587# RUN: llvm-readobj --program-headers %tmips.elf | FileCheck %s --check-prefix=MIPS-LLVM 588 589# MIPS-GNU: REGINFO 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 590# MIPS-GNU-NEXT: RTPROC 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 591# MIPS-GNU-NEXT: OPTIONS 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 592# MIPS-GNU-NEXT: ABIFLAGS 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 593 594# MIPS-LLVM: ProgramHeader { 595# MIPS-LLVM: Type: PT_MIPS_REGINFO (0x70000000) 596# MIPS-LLVM: ProgramHeader { 597# MIPS-LLVM-NEXT: Type: PT_MIPS_RTPROC (0x70000001) 598# MIPS-LLVM: ProgramHeader { 599# MIPS-LLVM-NEXT: Type: PT_MIPS_OPTIONS (0x70000002) 600# MIPS-LLVM: ProgramHeader { 601# MIPS-LLVM-NEXT: Type: PT_MIPS_ABIFLAGS (0x70000003) 602 603## CHECK how we dump RISCV specific program headers. 604# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_RISCV %s -o %triscv.elf 605# RUN: llvm-readelf --program-headers %triscv.elf | FileCheck %s --check-prefix=RISCV-GNU 606# RUN: llvm-readobj --program-headers %triscv.elf | FileCheck %s --check-prefix=RISCV-LLVM 607 608# RISCV-GNU: ATTRIBUTES 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1 609# RISCV-LLVM: ProgramHeader { 610# RISCV-LLVM: Type: PT_RISCV_ATTRIBUTES (0x70000003) 611 612## Check that llvm-readelf reports a warning when a program interpreter 613## name is non-null-terminated or when PT_INTERP has an offset that 614## goes past the end of the file. 615# RUN: yaml2obj --docnum=2 %s -o %t.err 616 617## Show the size of the output produced. It is used in the YAML below. 618# RUN: wc -c < %t.err | FileCheck %s --check-prefix=SIZE 619# SIZE: 616 620 621## Write the additional 'C', '\0, 'C' bytes to the end. 622# RUN: echo -n -e "C\x00C" >> %t.err 623 624# RUN: llvm-readelf --program-headers %t.err 2>&1 | \ 625# RUN: FileCheck %s -DFILE=%t.err --check-prefix=ERROR-INTERP --implicit-check-not=warning: 626 627# ERROR-INTERP: Type Offset 628# ERROR-INTERP-NEXT: INTERP 0x000[[#%x,OFFSET:0x268]] 629# ERROR-INTERP-NEXT: [Requesting program interpreter: C] 630# ERROR-INTERP-NEXT: INTERP 0x000[[#OFFSET + 1]] 631# ERROR-INTERP-NEXT: [Requesting program interpreter: ] 632# ERROR-INTERP-NEXT: INTERP 0x000[[#OFFSET + 2]] 633# ERROR-INTERP-NEXT: warning: '[[FILE]]': unable to read program interpreter name at offset 0x[[#OFFSET+2]]: it is not null-terminated 634# ERROR-INTERP-NEXT: INTERP 0x000[[#OFFSET + 3]] 635# ERROR-INTERP-NEXT: warning: '[[FILE]]': unable to read program interpreter name at offset 0x[[#OFFSET+3]]: it goes past the end of the file (0x[[#OFFSET + 3]]) 636# ERROR-INTERP-NEXT: INTERP 0xaabbccddeeff1122 637# ERROR-INTERP-NEXT: warning: '[[FILE]]': unable to read program interpreter name at offset 0xaabbccddeeff1122: it goes past the end of the file (0x[[#OFFSET + 3]]) 638# ERROR-INTERP-NEXT: INTERP 0xaabbccddeeff1122 639 640--- !ELF 641FileHeader: 642 Class: ELFCLASS64 643 Data: ELFDATA2LSB 644 Type: ET_EXEC 645ProgramHeaders: 646## Case 1: the offset points to the first additional byte. 647 - Type: PT_INTERP 648 Offset: 616 649## Case 1: the offset points to the second additional byte, 650## which is a null byte. 651 - Type: PT_INTERP 652 Offset: 617 653## Case 3: the offset points to the third additional 654## byte, which is the last byte in the file. 655 - Type: PT_INTERP 656 Offset: 618 657## Case 4: the offset goes 1 byte past the end of the file. 658 - Type: PT_INTERP 659 Offset: 619 660## Case 5: an arbitrary large offset that goes past the end of the file. 661 - Type: PT_INTERP 662 Offset: 0xAABBCCDDEEFF1122 663## Case 6: the same as case 5. Used to demonstrate that we don't report 664## the same warning twice. 665 - Type: PT_INTERP 666 Offset: 0xAABBCCDDEEFF1122 667 668## Check we report a warning when we are unable to read program headers. 669## Case A: the e_phentsize field is invalid. 670# RUN: yaml2obj --docnum=3 -DPHENTSIZE=1 %s -o %t.phdr.err 671# RUN: llvm-readelf --program-headers %t.phdr.err 2>&1 | \ 672# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE-GNU 673# RUN: llvm-readobj --program-headers %t.phdr.err 2>&1 | \ 674# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE-LLVM 675 676# WARN-PHENTSIZE-GNU: Program Headers: 677# WARN-PHENTSIZE-GNU-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 678# WARN-PHENTSIZE-GNU-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1 679# WARN-PHENTSIZE-GNU: Section to Segment mapping: 680# WARN-PHENTSIZE-GNU-NEXT: Segment Sections... 681# WARN-PHENTSIZE-GNU-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: invalid e_phentsize: 1 682 683# WARN-PHENTSIZE-LLVM: ProgramHeaders [ 684# WARN-PHENTSIZE-LLVM-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1 685# WARN-PHENTSIZE-LLVM-NEXT: ] 686 687--- !ELF 688FileHeader: 689 Class: ELFCLASS64 690 Data: ELFDATA2LSB 691 Type: ET_EXEC 692 EPhEntSize: [[PHENTSIZE=<none>]] 693 EPhOff: [[PHOFF=<none>]] 694Sections: 695 - Name: .foo 696 Type: SHT_PROGBITS 697ProgramHeaders: 698 - Type: PT_PHDR 699 FirstSec: .foo 700 LastSec: .foo 701 702## Case B: the value of the e_phoff field is invalid. 703 704## Check that we do not report a warning when the program header table ends right before the end of the file. 705## 0x160 + size of headers (56) == file size. 706# RUN: yaml2obj --docnum=3 -DPHOFF=0x160 %s -o %t.phdr.no.err2 707# RUN: llvm-readelf %t.phdr.no.err2 --program-headers 2>&1 | FileCheck %s --implicit-check-not=warning: 708# RUN: llvm-readobj %t.phdr.no.err2 --program-headers 2>&1 | FileCheck %s --implicit-check-not=warning: 709 710## Check we report a warning when e_phoff goes 1 byte past the end of the file. 711# RUN: yaml2obj --docnum=3 -DPHOFF=0x161 %s -o %t.phdr.err2 712# RUN: llvm-readelf --program-headers %t.phdr.err2 2>&1 | \ 713# RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=WARN-PHOFF-GNU -DOFF=0x161 714# RUN: llvm-readobj --program-headers %t.phdr.err2 2>&1 | \ 715# RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=WARN-PHOFF-LLVM -DOFF=0x161 716 717# WARN-PHOFF-GNU: Program Headers: 718# WARN-PHOFF-GNU-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 719# WARN-PHOFF-GNU-NEXT: warning: '[[FILE]]': unable to dump program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 720# WARN-PHOFF-GNU: Section to Segment mapping: 721# WARN-PHOFF-GNU-NEXT: Segment Sections... 722# WARN-PHOFF-GNU-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 723 724# WARN-PHOFF-LLVM: ProgramHeaders [ 725# WARN-PHOFF-LLVM-NEXT: warning: '[[FILE]]': unable to dump program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 726# WARN-PHOFF-LLVM-NEXT: ] 727 728## Check we report a warning when the value of e_phoff is so large that 729## e_phoff + e_phnum * e_phentsize > UINT64_MAX. 730# RUN: yaml2obj --docnum=3 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3 731# RUN: llvm-readelf --program-headers %t.phdr.err3 2>&1 | \ 732# RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=WARN-PHOFF-GNU -DOFF=0xffffffffffffffff 733# RUN: llvm-readobj --program-headers %t.phdr.err3 2>&1 | \ 734# RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=WARN-PHOFF-LLVM -DOFF=0xffffffffffffffff 735