1## Check llvm-readobj and llvm-readelf print relocations as expected.
2
3## Show that ELF64 is dumped correctly.
4# RUN: yaml2obj %s --docnum=1 -o %t64
5# RUN: llvm-readobj -r %t64 \
6# RUN:   | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines
7# RUN: llvm-readobj --relocs %t64 \
8# RUN:   | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines
9# RUN: llvm-readobj --relocations %t64 \
10# RUN:   | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines
11
12#      LLVM-64:Relocations [
13# LLVM-64-NEXT:  Section (2) .rel.text {
14# LLVM-64-NEXT:    0x0 R_X86_64_NONE rel_0
15# LLVM-64-NEXT:    0x1 R_X86_64_PC32 rel_neg
16# LLVM-64-NEXT:    0x5 R_X86_64_PLT32 rel_pos
17# LLVM-64-NEXT:    0x9 R_X86_64_64 rel_64
18# LLVM-64-NEXT:  }
19# LLVM-64-NEXT:  Section (3) .rela.text {
20# LLVM-64-NEXT:    0x0 R_X86_64_NONE rela_0 0x0
21# LLVM-64-NEXT:    0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
22# LLVM-64-NEXT:    0x5 R_X86_64_PLT32 rela_pos 0x2
23# LLVM-64-NEXT:    0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
24# LLVM-64-NEXT:    0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
25# LLVM-64-NEXT:  }
26# LLVM-64-NEXT:]
27
28# RUN: llvm-readelf -r %t64 \
29# RUN:   | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines
30# RUN: llvm-readelf --relocs %t64 \
31# RUN:   | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines
32# RUN: llvm-readelf --relocations %t64 \
33# RUN:   | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines
34
35#      GNU-64:Relocation section '.rel.text' at offset 0x51 contains 4 entries:
36# GNU-64-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name
37# GNU-64-NEXT:0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 rel_0
38# GNU-64-NEXT:0000000000000001  0000000200000002 R_X86_64_PC32          0000000000000001 rel_neg
39# GNU-64-NEXT:0000000000000005  0000000300000004 R_X86_64_PLT32         0000000000000002 rel_pos
40# GNU-64-NEXT:0000000000000009  0000000400000001 R_X86_64_64            ffffffffffffffff rel_64
41# GNU-64-EMPTY:
42# GNU-64-NEXT:Relocation section '.rela.text' at offset 0x91 contains 5 entries:
43# GNU-64-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
44# GNU-64-NEXT:0000000000000000  0000000500000000 R_X86_64_NONE          0000000000000000 rela_0 + 0
45# GNU-64-NEXT:0000000000000001  0000000600000002 R_X86_64_PC32          0000000000000001 rela_neg - 1
46# GNU-64-NEXT:0000000000000005  0000000700000004 R_X86_64_PLT32         0000000000000002 rela_pos + 2
47# GNU-64-NEXT:ffffffffffffffff  0000000800000001 R_X86_64_64            0000000000000003 rela_minneg - 8000000000000000
48# GNU-64-NEXT:0000000000000009  000000090000000b R_X86_64_32S           ffffffffffffffff rela_maxpos + 7fffffffffffffff
49
50## Show that --expand-relocs expands the relocation dump for LLVM style only
51## (and not GNU).
52# RUN: llvm-readobj -r --expand-relocs %t64 \
53# RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-64 --match-full-lines --strict-whitespace
54# RUN: llvm-readelf -r --expand-relocs %t64 \
55# RUN:   | FileCheck %s --check-prefix=GNU-64 --match-full-lines --strict-whitespace
56
57#      LLVM-EXPAND-64:Relocations [
58# LLVM-EXPAND-64-NEXT:  Section (2) .rel.text {
59# LLVM-EXPAND-64-NEXT:    Relocation {
60# LLVM-EXPAND-64-NEXT:      Offset: 0x0
61# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_NONE (0)
62# LLVM-EXPAND-64-NEXT:      Symbol: rel_0 (1)
63# LLVM-EXPAND-64-NEXT:    }
64# LLVM-EXPAND-64-NEXT:    Relocation {
65# LLVM-EXPAND-64-NEXT:      Offset: 0x1
66# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PC32 (2)
67# LLVM-EXPAND-64-NEXT:      Symbol: rel_neg (2)
68# LLVM-EXPAND-64-NEXT:    }
69# LLVM-EXPAND-64-NEXT:    Relocation {
70# LLVM-EXPAND-64-NEXT:      Offset: 0x5
71# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PLT32 (4)
72# LLVM-EXPAND-64-NEXT:      Symbol: rel_pos (3)
73# LLVM-EXPAND-64-NEXT:    }
74# LLVM-EXPAND-64-NEXT:    Relocation {
75# LLVM-EXPAND-64-NEXT:      Offset: 0x9
76# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_64 (1)
77# LLVM-EXPAND-64-NEXT:      Symbol: rel_64 (4)
78# LLVM-EXPAND-64-NEXT:    }
79# LLVM-EXPAND-64-NEXT:  }
80# LLVM-EXPAND-64-NEXT:  Section (3) .rela.text {
81# LLVM-EXPAND-64-NEXT:    Relocation {
82# LLVM-EXPAND-64-NEXT:      Offset: 0x0
83# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_NONE (0)
84# LLVM-EXPAND-64-NEXT:      Symbol: rela_0 (5)
85# LLVM-EXPAND-64-NEXT:      Addend: 0x0
86# LLVM-EXPAND-64-NEXT:    }
87# LLVM-EXPAND-64-NEXT:    Relocation {
88# LLVM-EXPAND-64-NEXT:      Offset: 0x1
89# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PC32 (2)
90# LLVM-EXPAND-64-NEXT:      Symbol: rela_neg (6)
91# LLVM-EXPAND-64-NEXT:      Addend: 0xFFFFFFFFFFFFFFFF
92# LLVM-EXPAND-64-NEXT:    }
93# LLVM-EXPAND-64-NEXT:    Relocation {
94# LLVM-EXPAND-64-NEXT:      Offset: 0x5
95# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PLT32 (4)
96# LLVM-EXPAND-64-NEXT:      Symbol: rela_pos (7)
97# LLVM-EXPAND-64-NEXT:      Addend: 0x2
98# LLVM-EXPAND-64-NEXT:    }
99# LLVM-EXPAND-64-NEXT:    Relocation {
100# LLVM-EXPAND-64-NEXT:      Offset: 0xFFFFFFFFFFFFFFFF
101# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_64 (1)
102# LLVM-EXPAND-64-NEXT:      Symbol: rela_minneg (8)
103# LLVM-EXPAND-64-NEXT:      Addend: 0x8000000000000000
104# LLVM-EXPAND-64-NEXT:    }
105# LLVM-EXPAND-64-NEXT:    Relocation {
106# LLVM-EXPAND-64-NEXT:      Offset: 0x9
107# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_32S (11)
108# LLVM-EXPAND-64-NEXT:      Symbol: rela_maxpos (9)
109# LLVM-EXPAND-64-NEXT:      Addend: 0x7FFFFFFFFFFFFFFF
110# LLVM-EXPAND-64-NEXT:    }
111# LLVM-EXPAND-64-NEXT:  }
112# LLVM-EXPAND-64-NEXT:]
113
114--- !ELF
115FileHeader:
116  Class:   ELFCLASS64
117  Data:    ELFDATA2LSB
118  Type:    ET_REL
119  Machine: EM_X86_64
120Sections:
121  - Name: .text
122    Type: SHT_PROGBITS
123    Content: '00FFFFFFFF020000001234567890ABCDEF'
124  - Name:    .rel.text
125    Type:    SHT_REL
126    Info:    .text
127    Link:    [[LINK=.symtab]]
128    ShName:  [[SHNAME=<none>]]
129    EntSize: [[ENTSIZEREL=<none>]]
130    Relocations:
131      - Symbol: rel_0
132        Type:   R_X86_64_NONE
133      - Offset: 0x1
134        Symbol: rel_neg
135        Type:   R_X86_64_PC32
136      - Offset: 0x5
137        Symbol: rel_pos
138        Type:   R_X86_64_PLT32
139      - Offset: 0x9
140        Symbol: rel_64
141        Type:   R_X86_64_64
142  - Name:    .rela.text
143    Type:    SHT_RELA
144    Info:    .text
145    Link:    [[LINK=.symtab]]
146    ShName:  [[SHNAME=<none>]]
147    EntSize: [[ENTSIZERELA=<none>]]
148    Relocations:
149      - Symbol: rela_0
150        Type:   R_X86_64_NONE
151        Addend: 0
152      - Offset: 0x1
153        Symbol: rela_neg
154        Type:   R_X86_64_PC32
155        Addend: -1
156      - Offset: 0x5
157        Symbol: rela_pos
158        Type:   R_X86_64_PLT32
159        Addend: 2
160      - Offset: 0xFFFFFFFFFFFFFFFF
161        Symbol: rela_minneg
162        Type:   R_X86_64_64
163        Addend: -9223372036854775808 ## Min 64-bit signed.
164      - Offset: 0x9
165        Symbol: rela_maxpos
166        Type:   R_X86_64_32S
167        Addend: 9223372036854775807 ## Max 64-bit signed.
168Symbols:
169  - Name:    rel_0
170    Section: .text
171    Value:   0
172  - Name:     rel_neg
173    Section: .text
174    Value:   1
175  - Name:    rel_pos
176    Section: .text
177    Value:   2
178  - Name:    rel_64
179    Section: .text
180    Value:   0xFFFFFFFFFFFFFFFF
181  - Name:    rela_0
182    Section: .text
183    Value:   0
184  - Name:    rela_neg
185    Section: .text
186    Value:   1
187  - Name:    rela_pos
188    Section: .text
189    Value:   2
190  - Name:    rela_minneg
191    Section: .text
192    Value:   3
193  - Name:    rela_maxpos
194    Section: .text
195    Value:   0xFFFFFFFFFFFFFFFF
196
197## Check we report a warning when we are unable to dump relocations for a section.
198## Check we continue dumping other relocation sections if any.
199
200## Case A: check the case when relocations can't be read from an SHT_REL section.
201##         because of broken sh_entsize field.
202# RUN: yaml2obj %s --docnum=1 -DENTSIZEREL=1 -o %t.broken.rel
203# RUN: llvm-readobj --relocations %t.broken.rel 2>&1 \
204# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-LLVM
205# RUN: llvm-readelf --relocations %t.broken.rel 2>&1 \
206# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-GNU
207
208# BROKEN-REL-LLVM:      Relocations [
209# BROKEN-REL-LLVM-NEXT:   Section (2) .rel.text {
210# BROKEN-REL-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_REL section with index 2: section [index 2] has invalid sh_entsize: expected 16, but got 1
211# BROKEN-REL-LLVM-NEXT:   }
212# BROKEN-REL-LLVM-NEXT:   Section (3) .rela.text {
213# BROKEN-REL-LLVM-NEXT:     0x0 R_X86_64_NONE rela_0 0x0
214# BROKEN-REL-LLVM-NEXT:     0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
215# BROKEN-REL-LLVM-NEXT:     0x5 R_X86_64_PLT32 rela_pos 0x2
216# BROKEN-REL-LLVM-NEXT:     0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
217# BROKEN-REL-LLVM-NEXT:     0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
218# BROKEN-REL-LLVM-NEXT:   }
219# BROKEN-REL-LLVM-NEXT: ]
220
221# BROKEN-REL-GNU:      Relocation section '.rel.text' at offset 0x51 contains 64 entries:
222# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
223# BROKEN-REL-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_REL section with index 2: section [index 2] has invalid sh_entsize: expected 16, but got 1
224# BROKEN-REL-GNU:      Relocation section '.rela.text' at offset 0x91 contains 5 entries:
225# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
226# BROKEN-REL-GNU-NEXT: 0000000000000000  0000000500000000 R_X86_64_NONE  0000000000000000 rela_0 + 0
227# BROKEN-REL-GNU-NEXT: 0000000000000001  0000000600000002 R_X86_64_PC32  0000000000000001 rela_neg - 1
228# BROKEN-REL-GNU-NEXT: 0000000000000005  0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2
229# BROKEN-REL-GNU-NEXT: ffffffffffffffff  0000000800000001 R_X86_64_64    0000000000000003 rela_minneg - 8000000000000000
230# BROKEN-REL-GNU-NEXT: 0000000000000009  000000090000000b R_X86_64_32S   ffffffffffffffff rela_maxpos + 7fffffffffffffff
231
232## Case B: check the case when relocations can't be read from an SHT_RELA section.
233##         because of broken sh_entsize field.
234# RUN: yaml2obj %s --docnum=1 -DENTSIZERELA=1 -o %t.broken.rela
235# RUN: llvm-readobj --relocations %t.broken.rela 2>&1 \
236# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-LLVM
237# RUN: llvm-readelf --relocations %t.broken.rela 2>&1 \
238# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-GNU
239
240# BROKEN-RELA-LLVM:      Relocations [
241# BROKEN-RELA-LLVM-NEXT:   Section (2) .rel.text {
242# BROKEN-RELA-LLVM-NEXT:     0x0 R_X86_64_NONE rel_0{{$}}
243# BROKEN-RELA-LLVM-NEXT:     0x1 R_X86_64_PC32 rel_neg{{$}}
244# BROKEN-RELA-LLVM-NEXT:     0x5 R_X86_64_PLT32 rel_pos{{$}}
245# BROKEN-RELA-LLVM-NEXT:     0x9 R_X86_64_64 rel_64{{$}}
246# BROKEN-RELA-LLVM-NEXT:   }
247# BROKEN-RELA-LLVM-NEXT:   Section (3) .rela.text {
248# BROKEN-RELA-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has invalid sh_entsize: expected 24, but got 1
249# BROKEN-RELA-LLVM-NEXT:   }
250# BROKEN-RELA-LLVM-NEXT: ]
251
252# BROKEN-RELA-GNU:      Relocation section '.rel.text' at offset 0x51 contains 4 entries:
253# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
254# BROKEN-RELA-GNU-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE  0000000000000000 rel_0
255# BROKEN-RELA-GNU-NEXT: 0000000000000001  0000000200000002 R_X86_64_PC32  0000000000000001 rel_neg
256# BROKEN-RELA-GNU-NEXT: 0000000000000005  0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos
257# BROKEN-RELA-GNU-NEXT: 0000000000000009  0000000400000001 R_X86_64_64    ffffffffffffffff rel_64
258# BROKEN-RELA-GNU-EMPTY:
259# BROKEN-RELA-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 120 entries:
260# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
261# BROKEN-RELA-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has invalid sh_entsize: expected 24, but got 1
262
263## Case C: check the case when relocations can't be read from SHT_REL/SHT_RELA sections
264##         because of broken sh_link fields.
265# RUN: yaml2obj %s --docnum=1 -DLINK=0xffff -o %t.broken.link
266# RUN: llvm-readobj --relocations %t.broken.link 2>&1 \
267# RUN:   | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-LLVM
268# RUN: llvm-readelf --relocations %t.broken.link 2>&1 \
269# RUN:   | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-GNU
270
271# BROKEN-LINK-LLVM:      Relocations [
272# BROKEN-LINK-LLVM-NEXT:   Section (2) .rel.text {
273# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
274# BROKEN-LINK-LLVM-NEXT:   }
275# BROKEN-LINK-LLVM-NEXT:   Section (3) .rela.text {
276# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
277# BROKEN-LINK-LLVM-NEXT:   }
278# BROKEN-LINK-LLVM-NEXT: ]
279
280# BROKEN-LINK-GNU:      Relocation section '.rel.text' at offset 0x51 contains 4 entries:
281# BROKEN-LINK-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name
282# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
283# BROKEN-LINK-GNU-EMPTY:
284# BROKEN-LINK-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 5 entries:
285# BROKEN-LINK-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
286# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
287
288## Show that ELF32 is dumped correctly.
289# RUN: yaml2obj %s --docnum=2 -o %t32
290# RUN: llvm-readobj -r %t32 \
291# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
292# RUN: llvm-readobj --relocs %t32 \
293# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
294# RUN: llvm-readobj --relocations %t32 \
295# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
296
297#      LLVM-32:Relocations [
298# LLVM-32-NEXT:  Section (2) .rel.text {
299# LLVM-32-NEXT:    0x0 R_386_NONE rel_0
300# LLVM-32-NEXT:    0x1 R_386_PC32 rel_neg
301# LLVM-32-NEXT:    0x5 R_386_PLT32 rel_pos
302# LLVM-32-NEXT:  }
303# LLVM-32-NEXT:  Section (3) .rela.text {
304# LLVM-32-NEXT:    0x0 R_386_NONE rela_0 0x0
305# LLVM-32-NEXT:    0x1 R_386_PC32 rela_neg 0xFFFFFFFF
306# LLVM-32-NEXT:    0x5 R_386_PLT32 rela_pos 0x2
307# LLVM-32-NEXT:    0xFFFFFFFF R_386_32 rela_minneg 0x80000000
308# LLVM-32-NEXT:    0x9 R_386_GOT32 rela_maxpos 0x7FFFFFFF
309# LLVM-32-NEXT:  }
310# LLVM-32-NEXT:]
311
312# RUN: llvm-readelf -r %t32 \
313# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
314# RUN: llvm-readelf --relocs %t32 \
315# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
316# RUN: llvm-readelf --relocations %t32 \
317# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
318
319#      GNU-32:Relocation section '.rel.text' at offset 0x3d contains 3 entries:
320# GNU-32-NEXT: Offset     Info    Type                Sym. Value  Symbol's Name
321# GNU-32-NEXT:00000000  00000100 R_386_NONE             00000000   rel_0
322# GNU-32-NEXT:00000001  00000202 R_386_PC32             00000001   rel_neg
323# GNU-32-NEXT:00000005  00000304 R_386_PLT32            ffffffff   rel_pos
324# GNU-32-EMPTY:
325# GNU-32-NEXT:Relocation section '.rela.text' at offset 0x55 contains 5 entries:
326# GNU-32-NEXT: Offset     Info    Type                Sym. Value  Symbol's Name + Addend
327# GNU-32-NEXT:00000000  00000400 R_386_NONE             00000000   rela_0 + 0
328# GNU-32-NEXT:00000001  00000502 R_386_PC32             00000001   rela_neg - 1
329# GNU-32-NEXT:00000005  00000604 R_386_PLT32            00000002   rela_pos + 2
330# GNU-32-NEXT:ffffffff  00000701 R_386_32               00000003   rela_minneg - 80000000
331# GNU-32-NEXT:00000009  00000803 R_386_GOT32            ffffffff   rela_maxpos + 7fffffff
332
333## Show that --expand-relocs expands the relocation dump for LLVM style only
334## (and not GNU).
335# RUN: llvm-readobj -r --expand-relocs %t32 \
336# RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-32 --strict-whitespace --match-full-lines
337# RUN: llvm-readelf -r --expand-relocs %t32 \
338# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
339
340#      LLVM-EXPAND-32:Relocations [
341# LLVM-EXPAND-32-NEXT:  Section (2) .rel.text {
342# LLVM-EXPAND-32-NEXT:    Relocation {
343# LLVM-EXPAND-32-NEXT:      Offset: 0x0
344# LLVM-EXPAND-32-NEXT:      Type: R_386_NONE (0)
345# LLVM-EXPAND-32-NEXT:      Symbol: rel_0 (1)
346# LLVM-EXPAND-32-NEXT:    }
347# LLVM-EXPAND-32-NEXT:    Relocation {
348# LLVM-EXPAND-32-NEXT:      Offset: 0x1
349# LLVM-EXPAND-32-NEXT:      Type: R_386_PC32 (2)
350# LLVM-EXPAND-32-NEXT:      Symbol: rel_neg (2)
351# LLVM-EXPAND-32-NEXT:    }
352# LLVM-EXPAND-32-NEXT:    Relocation {
353# LLVM-EXPAND-32-NEXT:      Offset: 0x5
354# LLVM-EXPAND-32-NEXT:      Type: R_386_PLT32 (4)
355# LLVM-EXPAND-32-NEXT:      Symbol: rel_pos (3)
356# LLVM-EXPAND-32-NEXT:    }
357# LLVM-EXPAND-32-NEXT:  }
358# LLVM-EXPAND-32-NEXT:  Section (3) .rela.text {
359# LLVM-EXPAND-32-NEXT:    Relocation {
360# LLVM-EXPAND-32-NEXT:      Offset: 0x0
361# LLVM-EXPAND-32-NEXT:      Type: R_386_NONE (0)
362# LLVM-EXPAND-32-NEXT:      Symbol: rela_0 (4)
363# LLVM-EXPAND-32-NEXT:      Addend: 0x0
364# LLVM-EXPAND-32-NEXT:    }
365# LLVM-EXPAND-32-NEXT:    Relocation {
366# LLVM-EXPAND-32-NEXT:      Offset: 0x1
367# LLVM-EXPAND-32-NEXT:      Type: R_386_PC32 (2)
368# LLVM-EXPAND-32-NEXT:      Symbol: rela_neg (5)
369# LLVM-EXPAND-32-NEXT:      Addend: 0xFFFFFFFF
370# LLVM-EXPAND-32-NEXT:    }
371# LLVM-EXPAND-32-NEXT:    Relocation {
372# LLVM-EXPAND-32-NEXT:      Offset: 0x5
373# LLVM-EXPAND-32-NEXT:      Type: R_386_PLT32 (4)
374# LLVM-EXPAND-32-NEXT:      Symbol: rela_pos (6)
375# LLVM-EXPAND-32-NEXT:      Addend: 0x2
376# LLVM-EXPAND-32-NEXT:    }
377# LLVM-EXPAND-32-NEXT:    Relocation {
378# LLVM-EXPAND-32-NEXT:      Offset: 0xFFFFFFFF
379# LLVM-EXPAND-32-NEXT:      Type: R_386_32 (1)
380# LLVM-EXPAND-32-NEXT:      Symbol: rela_minneg (7)
381# LLVM-EXPAND-32-NEXT:      Addend: 0x80000000
382# LLVM-EXPAND-32-NEXT:    }
383# LLVM-EXPAND-32-NEXT:    Relocation {
384# LLVM-EXPAND-32-NEXT:      Offset: 0x9
385# LLVM-EXPAND-32-NEXT:      Type: R_386_GOT32 (3)
386# LLVM-EXPAND-32-NEXT:      Symbol: rela_maxpos (8)
387# LLVM-EXPAND-32-NEXT:      Addend: 0x7FFFFFFF
388# LLVM-EXPAND-32-NEXT:    }
389# LLVM-EXPAND-32-NEXT:  }
390# LLVM-EXPAND-32-NEXT:]
391
392--- !ELF
393FileHeader:
394  Class:   ELFCLASS32
395  Data:    ELFDATA2LSB
396  Type:    ET_REL
397  Machine: EM_386
398Sections:
399  - Name: .text
400    Type: SHT_PROGBITS
401    Content: '00FFFFFFFF02000000'
402  - Name: .rel.text
403    Type: SHT_REL
404    Info: .text
405    Relocations:
406      - Symbol: rel_0
407        Type:   R_386_NONE
408      - Offset: 0x1
409        Symbol: rel_neg
410        Type:   R_386_PC32
411      - Offset: 0x5
412        Symbol: rel_pos
413        Type:   R_386_PLT32
414  - Name: .rela.text
415    Type: SHT_RELA
416    Info: .text
417    Relocations:
418      - Symbol: rela_0
419        Type:   R_386_NONE
420        Addend: 0
421      - Offset: 0x1
422        Symbol: rela_neg
423        Type:   R_386_PC32
424        Addend: -1
425      - Offset: 0x5
426        Symbol: rela_pos
427        Type:   R_386_PLT32
428        Addend: 2
429      - Offset: 0xFFFFFFFF
430        Symbol: rela_minneg
431        Type:   R_386_32
432        Addend: -2147483648 ## Min 32-bit signed.
433      - Offset: 0x9
434        Symbol: rela_maxpos
435        Type:   R_386_GOT32
436        Addend: 2147483647 ## Max 32-bit signed.
437Symbols:
438  - Name:    rel_0
439    Section: .text
440    Value:   0
441  - Name:    rel_neg
442    Section: .text
443    Value:   1
444  - Name:    rel_pos
445    Section: .text
446    Value:   0xFFFFFFFF
447  - Name:    rela_0
448    Section: .text
449    Value:   0
450  - Name:    rela_neg
451    Section: .text
452    Value:   1
453  - Name:    rela_pos
454    Section: .text
455    Value:   2
456  - Name:    rela_minneg
457    Section: .text
458    Value:   3
459  - Name:    rela_maxpos
460    Section: .text
461    Value:   0xFFFFFFFF
462
463## Check we report a warning when the name of a relocation section can't be read. Check we continue dumping.
464# RUN: yaml2obj %s --docnum=1 -DSHNAME=0xffffffff -o %tshname
465# RUN: llvm-readobj --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=LLVM-SHNAME
466# RUN: llvm-readelf --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=GNU-SHNAME
467
468# LLVM-SHNAME:      Relocations [
469# LLVM-SHNAME-NEXT: warning: '[[FILE]]': unable to get the name of SHT_REL section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table
470# LLVM-SHNAME-NEXT:   Section (2) <?> {
471# LLVM-SHNAME-NEXT:     0x0 R_X86_64_NONE rel_0{{$}}
472# LLVM-SHNAME-NEXT:     0x1 R_X86_64_PC32 rel_neg{{$}}
473# LLVM-SHNAME-NEXT:     0x5 R_X86_64_PLT32 rel_pos{{$}}
474# LLVM-SHNAME-NEXT:     0x9 R_X86_64_64 rel_64{{$}}
475# LLVM-SHNAME-NEXT:   }
476# LLVM-SHNAME-NEXT: warning: '[[FILE]]': unable to get the name of SHT_RELA section with index 3: a section [index 3] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table
477# LLVM-SHNAME-NEXT:   Section (3) <?> {
478# LLVM-SHNAME-NEXT:     0x0 R_X86_64_NONE rela_0 0x0
479# LLVM-SHNAME-NEXT:     0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
480# LLVM-SHNAME-NEXT:     0x5 R_X86_64_PLT32 rela_pos 0x2
481# LLVM-SHNAME-NEXT:     0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
482# LLVM-SHNAME-NEXT:     0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
483# LLVM-SHNAME-NEXT:   }
484# LLVM-SHNAME-NEXT: ]
485
486# GNU-SHNAME:      warning: '[[FILE]]': unable to get the name of SHT_REL section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table
487# GNU-SHNAME:      Relocation section '<?>' at offset 0x51 contains 4 entries:
488# GNU-SHNAME-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name
489# GNU-SHNAME-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 rel_0
490# GNU-SHNAME-NEXT: 0000000000000001  0000000200000002 R_X86_64_PC32          0000000000000001 rel_neg
491# GNU-SHNAME-NEXT: 0000000000000005  0000000300000004 R_X86_64_PLT32         0000000000000002 rel_pos
492# GNU-SHNAME-NEXT: 0000000000000009  0000000400000001 R_X86_64_64            ffffffffffffffff rel_64
493# GNU-SHNAME:      warning: '[[FILE]]': unable to get the name of SHT_RELA section with index 3: a section [index 3] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table
494# GNU-SHNAME:      Relocation section '<?>' at offset 0x91 contains 5 entries:
495# GNU-SHNAME-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name + Addend
496# GNU-SHNAME-NEXT: 0000000000000000  0000000500000000 R_X86_64_NONE  0000000000000000 rela_0 + 0
497# GNU-SHNAME-NEXT: 0000000000000001  0000000600000002 R_X86_64_PC32  0000000000000001 rela_neg - 1
498# GNU-SHNAME-NEXT: 0000000000000005  0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2
499# GNU-SHNAME-NEXT: ffffffffffffffff  0000000800000001 R_X86_64_64    0000000000000003 rela_minneg - 8000000000000000
500# GNU-SHNAME-NEXT: 0000000000000009  000000090000000b R_X86_64_32S   ffffffffffffffff rela_maxpos + 7fffffffffffffff
501
502## Check that we report a warning when a relocation has a
503## symbol index past the end of the symbol table
504
505# RUN: yaml2obj %s --docnum=3 -o %t3
506# RUN: llvm-readobj --relocs %t3 2>&1 | \
507# RUN:   FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=LLVM-SYMNDX
508# RUN: llvm-readelf --relocs %t3 2>&1 | \
509# RUN:   FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=GNU-SYMNDX
510
511# LLVM-SYMNDX:      Relocations [
512# LLVM-SYMNDX-NEXT:   Section (1) .rela.text {
513# LLVM-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 0 in SHT_RELA section with index 1: unable to read an entry with index 2 from SHT_SYMTAB section with index 2: can't read an entry at 0x30: it goes past the end of the section (0x30)
514# LLVM-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 1 in SHT_RELA section with index 1: unable to read an entry with index 3 from SHT_SYMTAB section with index 2: can't read an entry at 0x48: it goes past the end of the section (0x30)
515# LLVM-SYMNDX-NEXT:   }
516# LLVM-SYMNDX-NEXT: ]
517
518# GNU-SYMNDX:      Relocation section '.rela.text' at offset 0x40 contains 2 entries:
519# GNU-SYMNDX-NEXT:     Offset             Info             Type     Symbol's Value  Symbol's Name + Addend
520# GNU-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 0 in SHT_RELA section with index 1: unable to read an entry with index 2 from SHT_SYMTAB section with index 2: can't read an entry at 0x30: it goes past the end of the section (0x30)
521# GNU-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 1 in SHT_RELA section with index 1: unable to read an entry with index 3 from SHT_SYMTAB section with index 2: can't read an entry at 0x48: it goes past the end of the section (0x30)
522
523--- !ELF
524FileHeader:
525  Class:   ELFCLASS64
526  Data:    ELFDATA2LSB
527  Type:    ET_DYN
528  Machine: EM_X86_64
529Sections:
530  - Name: .rela.text
531    Type: SHT_RELA
532    Relocations:
533      - Type:   R_X86_64_NONE
534        Symbol: 0x2
535      - Type:   R_X86_64_NONE
536        Symbol: 0x3
537Symbols:
538  - Name: foo
539