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    Sections:
452      - Section: .foo.begin
453      - Section: .foo.end
454## Case 2: another segment with different sections.
455  - Type:  PT_PHDR
456    Flags: [ PF_X ]
457    VAddr: 0x2000
458    Sections:
459      - Section: .bar.begin
460      - Section: .bar.end
461## Case 3: the PT_NULL segment.
462  - Type:  PT_NULL
463    Flags: [ PF_X ]
464    VAddr: 0x2000
465    Sections:
466      - Section: .bar.begin
467      - Section: .bar.end
468## Case 4: the PT_DYNAMIC segment.
469  - Type:  PT_DYNAMIC
470    Flags: [ PF_R, PF_W, PF_X ]
471    VAddr: 0x1000
472    Sections:
473      - Section: .foo.begin
474      - Section: .foo.end
475## Case 5: the PT_INTERP segment.
476  - Type:  PT_INTERP
477    Flags: [ PF_R, PF_W ]
478    VAddr: 0x3000
479    Sections:
480      - Section: .interp
481## Case 6: the PT_NOTE segment.
482  - Type: PT_NOTE
483    VAddr: 0x1000
484    Sections:
485      - Section: .foo.begin
486      - Section: .foo.end
487## Case 7: the PT_SHLIB segment.
488  - Type: PT_SHLIB
489    VAddr: 0x1000
490    Sections:
491      - Section: .foo.begin
492## Case 8: the PT_TLS segment.
493  - Type: PT_TLS
494    VAddr: 0x4000
495    Sections:
496      - Section: .tls
497## Case 9: the PT_LOOS segment.
498  - Type:  0x60000000 ## PT_LOOS
499    VAddr: 0x1000
500    Sections:
501      - Section: .foo.begin
502      - Section: .foo.end
503## Case 10: the PT_GNU_EH_FRAME segment.
504  - Type: PT_GNU_EH_FRAME
505    VAddr: 0x1000
506    Sections:
507      - Section: .foo.begin
508      - Section: .foo.end
509## Case 11: the PT_SUNW_UNWIND segment.
510  - Type: 0x6464e550 ## PT_SUNW_UNWIND
511    VAddr: 0x1000
512    Sections:
513      - Section: .foo.begin
514      - Section: .foo.end
515## Case 12: the PT_GNU_STACK segment.
516  - Type: PT_GNU_STACK
517    Sections:
518    VAddr: 0x1000
519    Sections:
520      - Section: .foo.begin
521      - Section: .foo.end
522## Case 13: the PT_GNU_RELRO segment.
523  - Type: PT_GNU_RELRO
524    VAddr: 0x1000
525    Sections:
526      - Section: .foo.begin
527      - Section: .foo.end
528## Case 14: the PT_GNU_PROPERTY segment.
529  - Type: PT_GNU_PROPERTY
530    VAddr: 0x1000
531    Sections:
532      - Section: .foo.begin
533      - Section: .foo.end
534## Case 15: the PT_OPENBSD_RANDOMIZE segment.
535  - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE
536    VAddr: 0x1000
537    Sections:
538      - Section: .foo.begin
539      - Section: .foo.end
540## Case 16: the PT_OPENBSD_WXNEEDED segment.
541  - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED
542    VAddr: 0x1000
543    Sections:
544      - Section: .foo.begin
545      - Section: .foo.end
546## Case 17: the PT_OPENBSD_BOOTDATA segment.
547  - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA
548    VAddr: 0x1000
549    Sections:
550      - Section: .foo.begin
551      - Section: .foo.end
552## Case 18: the PT_HIOS segment.
553  - Type: 0x6fffffff ## PT_HIOS
554    VAddr: 0x1000
555    Sections:
556      - Section: .foo.begin
557      - Section: .foo.end
558## Case 19: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment.
559  - Type: 0x70000000 ## PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO
560    VAddr: 0x1000
561    Sections:
562      - Section: .foo.begin
563      - Section: .foo.end
564## Case 20: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment.
565  - Type: 0x70000001 ## PT_ARM_EXIDX, PT_MIPS_RTPROC
566    VAddr: 0x1000
567    Sections:
568      - Section: .foo.begin
569      - Section: .foo.end
570## Case 20: the PT_MIPS_OPTIONS segment.
571  - Type: 0x70000002 ## PT_MIPS_OPTIONS
572    VAddr: 0x1000
573    Sections:
574      - Section: .foo.begin
575      - Section: .foo.end
576## Case 21: the PT_MIPS_ABIFLAGS segment.
577  - Type: 0x70000003 ## PT_MIPS_ABIFLAGS
578    VAddr: 0x1000
579    Sections:
580      - Section: .foo.begin
581      - Section: .foo.end
582## Case 22: the PT_HIPROC segment.
583  - Type: 0x7fffffff ## PT_HIPROC
584    VAddr: 0x1000
585    Sections:
586      - Section: .foo.begin
587      - Section: .foo.end
588
589## Check how we dump ARM specific program headers.
590# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_ARM %s -o %tarm.elf
591# RUN: llvm-readelf --program-headers %tarm.elf | FileCheck %s --check-prefix=ARM-GNU
592# RUN: llvm-readobj --program-headers %tarm.elf | FileCheck %s --check-prefix=ARM-LLVM
593
594# ARM-GNU:      <unknown>: 0x70000000 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
595# ARM-GNU-NEXT:            EXIDX      0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
596# ARM-GNU-NEXT: <unknown>: 0x70000002 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
597
598# ARM-LLVM:      ProgramHeader {
599# ARM-LLVM:        Type: Unknown (0x70000000)
600# ARM-LLVM:      ProgramHeader {
601# ARM-LLVM-NEXT:   Type: PT_ARM_EXIDX (0x70000001)
602# ARM-LLVM:      ProgramHeader {
603# ARM-LLVM-NEXT:   Type: Unknown (0x70000002)
604
605## Check how we dump MIPS specific program headers.
606# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_MIPS %s -o %tmips.elf
607# RUN: llvm-readelf --program-headers %tmips.elf | FileCheck %s --check-prefix=MIPS-GNU
608# RUN: llvm-readobj --program-headers %tmips.elf | FileCheck %s --check-prefix=MIPS-LLVM
609
610# MIPS-GNU:      REGINFO  0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
611# MIPS-GNU-NEXT: RTPROC   0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
612# MIPS-GNU-NEXT: OPTIONS  0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
613# MIPS-GNU-NEXT: ABIFLAGS 0x000548 0x0000000000001000 0x0000000000001000 0x000003 0x000003 0x1
614
615# MIPS-LLVM:      ProgramHeader {
616# MIPS-LLVM:        Type: PT_MIPS_REGINFO (0x70000000)
617# MIPS-LLVM:      ProgramHeader {
618# MIPS-LLVM-NEXT:   Type: PT_MIPS_RTPROC (0x70000001)
619# MIPS-LLVM:      ProgramHeader {
620# MIPS-LLVM-NEXT:   Type: PT_MIPS_OPTIONS (0x70000002)
621# MIPS-LLVM:      ProgramHeader {
622# MIPS-LLVM-NEXT:   Type: PT_MIPS_ABIFLAGS (0x70000003)
623
624## Check that llvm-readelf reports a warning when a program interpreter
625## name is non-null-terminated or when PT_INTERP has an offset that
626## goes past the end of the file.
627# RUN: yaml2obj --docnum=2 %s -o %t.err
628
629## Show the size of the output produced. It is used in the YAML below.
630# RUN: wc -c < %t.err | FileCheck %s --check-prefix=SIZE
631# SIZE: 560
632
633## Write the additional 'C', '\0, 'C' bytes to the end.
634# RUN: echo -n -e "C\x00C" >> %t.err
635
636# RUN: llvm-readelf --program-headers %t.err 2>&1 | \
637# RUN:   FileCheck %s -DFILE=%t.err --check-prefix=ERROR-INTERP
638
639# ERROR-INTERP:      Type           Offset
640# ERROR-INTERP-NEXT: INTERP         0x000[[#%x,OFFSET:0x230]]
641# ERROR-INTERP-NEXT:     [Requesting program interpreter: C]
642# ERROR-INTERP-NEXT: INTERP         0x000[[#OFFSET + 1]]
643# ERROR-INTERP-NEXT:     [Requesting program interpreter: ]
644# ERROR-INTERP-NEXT: INTERP         0x000[[#OFFSET + 2]]
645# ERROR-INTERP-NEXT: warning: '[[FILE]]': unable to read program interpreter name at offset 0x[[#OFFSET+2]]: it is not null-terminated
646# ERROR-INTERP-NEXT: INTERP         0x000[[#OFFSET + 3]]
647# 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]])
648# ERROR-INTERP-NEXT: INTERP         0xaabbccddeeff1122
649# 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]])
650
651--- !ELF
652FileHeader:
653  Class: ELFCLASS64
654  Data:  ELFDATA2LSB
655  Type:  ET_EXEC
656ProgramHeaders:
657## Case 1: the offset points to the first additional byte.
658  - Type:   PT_INTERP
659    Offset: 560
660## Case 1: the offset points to the second additional byte,
661##         which is a null byte.
662  - Type:   PT_INTERP
663    Offset: 561
664## Case 3: the offset points to the third additional
665##         byte, which is the last byte in the file.
666  - Type:   PT_INTERP
667    Offset: 562
668## Case 4: the offset goes 1 byte past the end of the file.
669  - Type:   PT_INTERP
670    Offset: 563
671## Case 5: an arbitrary large offset that goes past the end of the file.
672  - Type:   PT_INTERP
673    Offset: 0xAABBCCDDEEFF1122
674
675## Check we report a warning when we are unable to read program headers.
676## Case A: the e_phentsize field is invalid.
677# RUN: yaml2obj --docnum=3 -DPHENTSIZE=1 %s -o %t.phdr.err
678# RUN: llvm-readelf --program-headers %t.phdr.err 2>&1 | \
679# RUN:   FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE-GNU
680# RUN: llvm-readobj --program-headers %t.phdr.err 2>&1 | \
681# RUN:   FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE-LLVM
682
683# WARN-PHENTSIZE-GNU:      Program Headers:
684# WARN-PHENTSIZE-GNU-NEXT:   Type Offset VirtAddr PhysAddr FileSiz  MemSiz Flg Align
685# WARN-PHENTSIZE-GNU-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1
686# WARN-PHENTSIZE-GNU:      Section to Segment mapping:
687# WARN-PHENTSIZE-GNU-NEXT:   Segment Sections...
688# WARN-PHENTSIZE-GNU-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: invalid e_phentsize: 1
689
690# WARN-PHENTSIZE-LLVM:      ProgramHeaders [
691# WARN-PHENTSIZE-LLVM-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1
692# WARN-PHENTSIZE-LLVM-NEXT: ]
693
694--- !ELF
695FileHeader:
696  Class:      ELFCLASS64
697  Data:       ELFDATA2LSB
698  Type:       ET_EXEC
699  EPhEntSize: [[PHENTSIZE=<none>]]
700  EPhOff:     [[PHOFF=<none>]]
701Sections:
702  - Name: .foo
703    Type: SHT_PROGBITS
704ProgramHeaders:
705  - Type: PT_PHDR
706    Sections:
707      - Section: .foo
708
709## Case B: the value of the e_phoff field is invalid.
710
711## Check that we do not report a warning when the program header table ends right before the end of the file.
712## 0x160 + size of headers (56) == file size.
713# RUN: yaml2obj --docnum=3 -DPHOFF=0x160 %s -o %t.phdr.no.err2
714# RUN: llvm-readelf %t.phdr.no.err2 --program-headers 2>&1 | FileCheck %s --implicit-check-not=warning:
715# RUN: llvm-readobj %t.phdr.no.err2 --program-headers 2>&1 | FileCheck %s --implicit-check-not=warning:
716
717## Check we report a warning when e_phoff goes 1 byte past the end of the file.
718# RUN: yaml2obj --docnum=3 -DPHOFF=0x161 %s -o %t.phdr.err2
719# RUN: llvm-readelf --program-headers %t.phdr.err2 2>&1 | \
720# RUN:   FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=WARN-PHOFF-GNU -DOFF=0x161
721# RUN: llvm-readobj --program-headers %t.phdr.err2 2>&1 | \
722# RUN:   FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=WARN-PHOFF-LLVM -DOFF=0x161
723
724# WARN-PHOFF-GNU:      Program Headers:
725# WARN-PHOFF-GNU-NEXT:   Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
726# 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
727# WARN-PHOFF-GNU:      Section to Segment mapping:
728# WARN-PHOFF-GNU-NEXT:   Segment Sections...
729# 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
730
731# WARN-PHOFF-LLVM:      ProgramHeaders [
732# 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
733# WARN-PHOFF-LLVM-NEXT: ]
734
735## Check we report a warning when the value of e_phoff is so large that
736## e_phoff + e_phnum * e_phentsize > UINT64_MAX.
737# RUN: yaml2obj --docnum=3 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3
738# RUN: llvm-readelf --program-headers %t.phdr.err3 2>&1 | \
739# RUN:   FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=WARN-PHOFF-GNU -DOFF=0xffffffffffffffff
740# RUN: llvm-readobj --program-headers %t.phdr.err3 2>&1 | \
741# RUN:   FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=WARN-PHOFF-LLVM -DOFF=0xffffffffffffffff
742