335 lines · plain
1## Check that program headers are output correctly2 3# RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t32.elf4# RUN: llvm-objdump --private-headers %t32.elf | FileCheck %s --check-prefixes=ELF32 5 6# ELF32: Program Header:7# ELF32-NEXT: PHDR off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**08# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags -w-9# ELF32-NEXT: PHDR off 0x00000337 vaddr 0x00002000 paddr 0x00002000 align 2**010# ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x11# ELF32-NEXT: UNKNOWN off 0x00000337 vaddr 0x00002000 paddr 0x00002000 align 2**012# ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x13# ELF32-NEXT: DYNAMIC off 0x00000344 vaddr 0x00006000 paddr 0x00006000 align 2**014# ELF32-NEXT: filesz 0x00000010 memsz 0x00000010 flags rwx15# ELF32-NEXT: INTERP off 0x0000033e vaddr 0x00003000 paddr 0x00003000 align 2**016# ELF32-NEXT: filesz 0x00000004 memsz 0x00000004 flags rw-17# ELF32-NEXT: NOTE off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**018# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---19# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**020# ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags ---21# ELF32-NEXT: TLS off 0x00000342 vaddr 0x00004000 paddr 0x00004000 align 2**022# ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags ---23# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**024# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---25# ELF32-NEXT:EH_FRAME off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**026# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---27# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**028# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---29# ELF32-NEXT: STACK off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**030# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---31# ELF32-NEXT: RELRO off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**032# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---33# ELF32-NEXT:PROPERTY off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**034# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---35# ELF32-NEXT: SFRAME off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**036# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---37# ELF32-NEXT: OPENBSD_RANDOMIZE off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**038# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---39# ELF32-NEXT: OPENBSD_WXNEEDED off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**040# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---41# ELF32-NEXT: OPENBSD_BOOTDATA off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**042# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---43# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**044# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---45# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**046# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---47# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**048# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---49# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**050# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---51# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**052# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---53# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**054# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags ---55# ELF32-EMPTY:56 57# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t64.elf58# RUN: llvm-objdump --private-headers %t64.elf | FileCheck %s --check-prefixes=ELF6459 60# ELF64: Program Header:61# ELF64-NEXT: PHDR off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**062# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags -w-63# ELF64-NEXT: PHDR off 0x0000000000000583 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**064# ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x65# ELF64-NEXT: UNKNOWN off 0x0000000000000583 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**066# ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x67# ELF64-NEXT: DYNAMIC off 0x0000000000000590 vaddr 0x0000000000006000 paddr 0x0000000000006000 align 2**068# ELF64-NEXT: filesz 0x0000000000000020 memsz 0x0000000000000020 flags rwx69# ELF64-NEXT: INTERP off 0x000000000000058a vaddr 0x0000000000003000 paddr 0x0000000000003000 align 2**070# ELF64-NEXT: filesz 0x0000000000000004 memsz 0x0000000000000004 flags rw-71# ELF64-NEXT: NOTE off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**072# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---73# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**074# ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags ---75# ELF64-NEXT: TLS off 0x000000000000058e vaddr 0x0000000000004000 paddr 0x0000000000004000 align 2**076# ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags ---77# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**078# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---79# ELF64-NEXT:EH_FRAME off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**080# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---81# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**082# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---83# ELF64-NEXT: STACK off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**084# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---85# ELF64-NEXT: RELRO off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**086# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---87# ELF64-NEXT: PROPERTY off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**088# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---89# ELF64-NEXT: SFRAME off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**090# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---91# ELF64-NEXT: OPENBSD_RANDOMIZE off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**092# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---93# ELF64-NEXT: OPENBSD_WXNEEDED off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**094# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---95# ELF64-NEXT: OPENBSD_BOOTDATA off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**096# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---97# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**098# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---99# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0100# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---101# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0102# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---103# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0104# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---105# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0106# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---107# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0108# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags ---109# ELF64-EMPTY:110 111--- !ELF112FileHeader:113 Class: ELFCLASS[[BITS]]114 Data: ELFDATA2LSB115 Type: ET_EXEC116 Machine: [[MACHINE]]117Sections:118 - Name: .foo.begin119 Type: SHT_PROGBITS120 Flags: [ SHF_ALLOC ]121 Address: 0x1000122 Size: 0x1123 - Name: .foo.end124 Type: SHT_PROGBITS125 Flags: [ SHF_ALLOC ]126 Size: 0x2127 - Name: .bar.begin128 Type: SHT_PROGBITS129 Flags: [ SHF_ALLOC ]130 Address: 0x2000131 Size: 0x3132 - Name: .bar.end133 Type: SHT_PROGBITS134 Flags: [ SHF_ALLOC ]135 Size: 0x4136 - Name: .interp137 Type: SHT_PROGBITS138 Flags: [ SHF_ALLOC ]139 Address: 0x3000140 Content: "41424300" ## "ABC"141 - Name: .tls142 Type: SHT_PROGBITS143 Flags: [ SHF_ALLOC, SHF_TLS ]144 Address: 0x4000145 Size: 0x1146 - Name: .unused147 Type: SHT_PROGBITS148 Flags: [ SHF_ALLOC, SHF_TLS ]149 Address: 0x5000150 Size: 0x1151 - Name: .dynamic152 Type: SHT_DYNAMIC153 Flags: [ SHF_ALLOC ]154 Address: 0x6000155 Entries:156 - Tag: DT_NEEDED157 Value: 0x1158 - Tag: DT_NULL159 Value: 0x0160ProgramHeaders:161## Case 1: an arbitrary segment with sections.162 - Type: PT_PHDR163 Flags: [ PF_W ]164 VAddr: 0x1000165 FirstSec: .foo.begin166 LastSec: .foo.end167## Case 2: another segment with different sections.168 - Type: PT_PHDR169 Flags: [ PF_X ]170 VAddr: 0x2000171 FirstSec: .bar.begin172 LastSec: .bar.end173## Case 3: the PT_NULL segment.174 - Type: PT_NULL175 Flags: [ PF_X ]176 VAddr: 0x2000177 FirstSec: .bar.begin178 LastSec: .bar.end179## Case 4: the PT_DYNAMIC segment.180 - Type: PT_DYNAMIC181 Flags: [ PF_R, PF_W, PF_X ]182 VAddr: 0x6000183 FirstSec: .dynamic184 LastSec: .dynamic185## Case 5: the PT_INTERP segment.186 - Type: PT_INTERP187 Flags: [ PF_R, PF_W ]188 VAddr: 0x3000189 FirstSec: .interp190 LastSec: .interp191## Case 6: the PT_NOTE segment.192 - Type: PT_NOTE193 VAddr: 0x1000194 FirstSec: .foo.begin195 LastSec: .foo.end196## Case 7: the PT_SHLIB segment.197 - Type: PT_SHLIB198 VAddr: 0x1000199 FirstSec: .foo.begin200 LastSec: .foo.begin201## Case 8: the PT_TLS segment.202 - Type: PT_TLS203 VAddr: 0x4000204 FirstSec: .tls205 LastSec: .tls206## Case 9: the PT_LOOS segment.207 - Type: 0x60000000 ## PT_LOOS208 VAddr: 0x1000209 FirstSec: .foo.begin210 LastSec: .foo.end211## Case 10: the PT_GNU_EH_FRAME segment.212 - Type: PT_GNU_EH_FRAME213 VAddr: 0x1000214 FirstSec: .foo.begin215 LastSec: .foo.end216## Case 11: the PT_SUNW_UNWIND segment.217 - Type: 0x6464e550 ## PT_SUNW_UNWIND218 VAddr: 0x1000219 FirstSec: .foo.begin220 LastSec: .foo.end221## Case 12: the PT_GNU_STACK segment.222 - Type: PT_GNU_STACK223 VAddr: 0x1000224 FirstSec: .foo.begin225 LastSec: .foo.end226## Case 13: the PT_GNU_RELRO segment.227 - Type: PT_GNU_RELRO228 VAddr: 0x1000229 FirstSec: .foo.begin230 LastSec: .foo.end231## Case 14: the PT_GNU_PROPERTY segment.232 - Type: PT_GNU_PROPERTY233 VAddr: 0x1000234 FirstSec: .foo.begin235 LastSec: .foo.end236## Case 15: the PT_GNU_SFRAME segment.237 - Type: 0x6474e554 ## PT_GNU_SFRAME238 VAddr: 0x1000239 FirstSec: .foo.begin240 LastSec: .foo.end241## Case 16: the PT_OPENBSD_RANDOMIZE segment.242 - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE243 VAddr: 0x1000244 FirstSec: .foo.begin245 LastSec: .foo.end246## Case 17: the PT_OPENBSD_WXNEEDED segment.247 - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED248 VAddr: 0x1000249 FirstSec: .foo.begin250 LastSec: .foo.end251## Case 18: the PT_OPENBSD_BOOTDATA segment.252 - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA253 VAddr: 0x1000254 FirstSec: .foo.begin255 LastSec: .foo.end256## Case 19: the PT_HIOS segment.257 - Type: 0x6fffffff ## PT_HIOS258 VAddr: 0x1000259 FirstSec: .foo.begin260 LastSec: .foo.end261## Case 20: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment.262 - Type: 0x70000000 ## PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO263 VAddr: 0x1000264 FirstSec: .foo.begin265 LastSec: .foo.end266## Case 21: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment.267 - Type: 0x70000001 ## PT_ARM_EXIDX, PT_MIPS_RTPROC268 VAddr: 0x1000269 FirstSec: .foo.begin270 LastSec: .foo.end271## Case 22: the PT_MIPS_OPTIONS segment.272 - Type: 0x70000002 ## PT_MIPS_OPTIONS273 VAddr: 0x1000274 FirstSec: .foo.begin275 LastSec: .foo.end276## Case 23: the PT_MIPS_ABIFLAGS segment.277 - Type: 0x70000003 ## PT_MIPS_ABIFLAGS278 VAddr: 0x1000279 FirstSec: .foo.begin280 LastSec: .foo.end281## Case 24: the PT_HIPROC segment.282 - Type: 0x7fffffff ## PT_HIPROC283 VAddr: 0x1000284 FirstSec: .foo.begin285 LastSec: .foo.end286 287## Check we report an error / warning when we are unable to read program headers.288## Case A: the e_phentsize field is invalid.289# RUN: yaml2obj --docnum=2 -DPHENTSIZE=1 %s -o %t.phdr.err290# RUN: llvm-objdump --private-headers %t.phdr.err 2>&1 | \291# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=PHENTSIZE292 293# PHENTSIZE: Program Header:294# PHENTSIZE-NEXT: warning: '[[FILE]]': unable to read program headers: invalid e_phentsize: 1295# PHENTSIZE-NEXT: warning: '[[FILE]]': invalid e_phentsize: 1296# PHENTSIZE-EMPTY:297 298--- !ELF299FileHeader:300 Class: ELFCLASS64301 Data: ELFDATA2LSB302 Type: ET_EXEC303 EPhEntSize: [[PHENTSIZE=<none>]]304 EPhOff: [[PHOFF=<none>]]305Sections:306 - Name: .foo307 Type: SHT_PROGBITS308ProgramHeaders:309 - Type: PT_PHDR310 FirstSec: .foo311 LastSec: .foo312 313## Case B: the value of the e_phoff field is invalid.314 315## Check that we do not report a warning when the program header table ends right before the end of the file.316## 0x160 + size of headers (56) == file size.317# RUN: yaml2obj --docnum=2 -DPHOFF=0x160 %s -o %t.phdr.no.err2318# RUN: llvm-objdump %t.phdr.no.err2 --private-headers 2>&1 | FileCheck %s --implicit-check-not=warning:319 320## Check we report a warning / error when e_phoff goes 1 byte past the end of the file.321# RUN: yaml2obj --docnum=2 -DPHOFF=0x161 %s -o %t.phdr.err2322# RUN: llvm-objdump --private-headers %t.phdr.err2 2>&1 | \323# RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=PHOFF -DOFF=0x161324 325# PHOFF: Program Header:326# 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 = 56327# PHOFF-NEXT: warning: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56328# PHOFF-EMPTY:329 330## Check we report a warning / error when the value of e_phoff is so large that331## e_phoff + e_phnum * e_phentsize > UINT64_MAX.332# RUN: yaml2obj --docnum=2 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3333# RUN: llvm-objdump --private-headers %t.phdr.err3 2>&1 | \334# RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=PHOFF -DOFF=0xffffffffffffffff335