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