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