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