xref: /llvm-project/llvm/test/tools/llvm-readobj/ELF/relocations.test (revision 681d5eecf7b32748763e5a8f56f7c334d8d6901e)
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 and not GNU.
51# RUN: llvm-readobj -r --expand-relocs %t64 \
52# RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-64 --match-full-lines --strict-whitespace
53# RUN: llvm-readelf -r --expand-relocs %t64 \
54# RUN:   | FileCheck %s --check-prefix=GNU-64 --match-full-lines --strict-whitespace
55
56#      LLVM-EXPAND-64:Relocations [
57# LLVM-EXPAND-64-NEXT:  Section (2) .rel.text {
58# LLVM-EXPAND-64-NEXT:    Relocation {
59# LLVM-EXPAND-64-NEXT:      Offset: 0x0
60# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_NONE (0)
61# LLVM-EXPAND-64-NEXT:      Symbol: rel_0 (1)
62# LLVM-EXPAND-64-NEXT:    }
63# LLVM-EXPAND-64-NEXT:    Relocation {
64# LLVM-EXPAND-64-NEXT:      Offset: 0x1
65# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PC32 (2)
66# LLVM-EXPAND-64-NEXT:      Symbol: rel_neg (2)
67# LLVM-EXPAND-64-NEXT:    }
68# LLVM-EXPAND-64-NEXT:    Relocation {
69# LLVM-EXPAND-64-NEXT:      Offset: 0x5
70# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PLT32 (4)
71# LLVM-EXPAND-64-NEXT:      Symbol: rel_pos (3)
72# LLVM-EXPAND-64-NEXT:    }
73# LLVM-EXPAND-64-NEXT:    Relocation {
74# LLVM-EXPAND-64-NEXT:      Offset: 0x9
75# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_64 (1)
76# LLVM-EXPAND-64-NEXT:      Symbol: rel_64 (4)
77# LLVM-EXPAND-64-NEXT:    }
78# LLVM-EXPAND-64-NEXT:  }
79# LLVM-EXPAND-64-NEXT:  Section (3) .rela.text {
80# LLVM-EXPAND-64-NEXT:    Relocation {
81# LLVM-EXPAND-64-NEXT:      Offset: 0x0
82# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_NONE (0)
83# LLVM-EXPAND-64-NEXT:      Symbol: rela_0 (5)
84# LLVM-EXPAND-64-NEXT:      Addend: 0x0
85# LLVM-EXPAND-64-NEXT:    }
86# LLVM-EXPAND-64-NEXT:    Relocation {
87# LLVM-EXPAND-64-NEXT:      Offset: 0x1
88# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PC32 (2)
89# LLVM-EXPAND-64-NEXT:      Symbol: rela_neg (6)
90# LLVM-EXPAND-64-NEXT:      Addend: 0xFFFFFFFFFFFFFFFF
91# LLVM-EXPAND-64-NEXT:    }
92# LLVM-EXPAND-64-NEXT:    Relocation {
93# LLVM-EXPAND-64-NEXT:      Offset: 0x5
94# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_PLT32 (4)
95# LLVM-EXPAND-64-NEXT:      Symbol: rela_pos (7)
96# LLVM-EXPAND-64-NEXT:      Addend: 0x2
97# LLVM-EXPAND-64-NEXT:    }
98# LLVM-EXPAND-64-NEXT:    Relocation {
99# LLVM-EXPAND-64-NEXT:      Offset: 0xFFFFFFFFFFFFFFFF
100# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_64 (1)
101# LLVM-EXPAND-64-NEXT:      Symbol: rela_minneg (8)
102# LLVM-EXPAND-64-NEXT:      Addend: 0x8000000000000000
103# LLVM-EXPAND-64-NEXT:    }
104# LLVM-EXPAND-64-NEXT:    Relocation {
105# LLVM-EXPAND-64-NEXT:      Offset: 0x9
106# LLVM-EXPAND-64-NEXT:      Type: R_X86_64_32S (11)
107# LLVM-EXPAND-64-NEXT:      Symbol: rela_maxpos (9)
108# LLVM-EXPAND-64-NEXT:      Addend: 0x7FFFFFFFFFFFFFFF
109# LLVM-EXPAND-64-NEXT:    }
110# LLVM-EXPAND-64-NEXT:  }
111# LLVM-EXPAND-64-NEXT:]
112
113## Show that JSON relocations are always expanded.
114# RUN: llvm-readobj -r %t64 --elf-output-style=JSON --pretty-print \
115# RUN:   | FileCheck %s --check-prefix=JSON-EXPAND-64
116# RUN: llvm-readobj -r --expand-relocs %t64 --elf-output-style=JSON --pretty-print \
117# RUN:   | FileCheck %s --check-prefix=JSON-EXPAND-64
118
119# JSON-EXPAND-64:      "Relocations": [
120# JSON-EXPAND-64-NEXT:   {
121# JSON-EXPAND-64-NEXT:   "SectionIndex": 2
122# JSON-EXPAND-64-NEXT:   "Relocs": [
123# JSON-EXPAND-64-NEXT:     {
124# JSON-EXPAND-64-NEXT:       "Relocation": {
125# JSON-EXPAND-64-NEXT:         "Offset": 0,
126# JSON-EXPAND-64-NEXT:         "Type": {
127# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_NONE",
128# JSON-EXPAND-64-NEXT:           "Value": 0
129# JSON-EXPAND-64-NEXT:         },
130# JSON-EXPAND-64-NEXT:         "Symbol": {
131# JSON-EXPAND-64-NEXT:           "Name": "rel_0",
132# JSON-EXPAND-64-NEXT:           "Value": 1
133# JSON-EXPAND-64-NEXT:         }
134# JSON-EXPAND-64-NEXT:       }
135# JSON-EXPAND-64-NEXT:     },
136# JSON-EXPAND-64-NEXT:     {
137# JSON-EXPAND-64-NEXT:       "Relocation": {
138# JSON-EXPAND-64-NEXT:         "Offset": 1,
139# JSON-EXPAND-64-NEXT:         "Type": {
140# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_PC32",
141# JSON-EXPAND-64-NEXT:           "Value": 2
142# JSON-EXPAND-64-NEXT:         },
143# JSON-EXPAND-64-NEXT:         "Symbol": {
144# JSON-EXPAND-64-NEXT:           "Name": "rel_neg",
145# JSON-EXPAND-64-NEXT:           "Value": 2
146# JSON-EXPAND-64-NEXT:         }
147# JSON-EXPAND-64-NEXT:       }
148# JSON-EXPAND-64-NEXT:     },
149# JSON-EXPAND-64-NEXT:     {
150# JSON-EXPAND-64-NEXT:       "Relocation": {
151# JSON-EXPAND-64-NEXT:         "Offset": 5,
152# JSON-EXPAND-64-NEXT:         "Type": {
153# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_PLT32",
154# JSON-EXPAND-64-NEXT:           "Value": 4
155# JSON-EXPAND-64-NEXT:         },
156# JSON-EXPAND-64-NEXT:         "Symbol": {
157# JSON-EXPAND-64-NEXT:           "Name": "rel_pos",
158# JSON-EXPAND-64-NEXT:           "Value": 3
159# JSON-EXPAND-64-NEXT:         }
160# JSON-EXPAND-64-NEXT:       }
161# JSON-EXPAND-64-NEXT:     },
162# JSON-EXPAND-64-NEXT:     {
163# JSON-EXPAND-64-NEXT:       "Relocation": {
164# JSON-EXPAND-64-NEXT:         "Offset": 9,
165# JSON-EXPAND-64-NEXT:         "Type": {
166# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_64",
167# JSON-EXPAND-64-NEXT:           "Value": 1
168# JSON-EXPAND-64-NEXT:         },
169# JSON-EXPAND-64-NEXT:         "Symbol": {
170# JSON-EXPAND-64-NEXT:           "Name": "rel_64",
171# JSON-EXPAND-64-NEXT:           "Value": 4
172# JSON-EXPAND-64-NEXT:         }
173# JSON-EXPAND-64-NEXT:       }
174# JSON-EXPAND-64-NEXT:     }
175# JSON-EXPAND-64-NEXT:    ]
176# JSON-EXPAND-64-NEXT:   },
177# JSON-EXPAND-64-NEXT:   {
178# JSON-EXPAND-64-NEXT:   "SectionIndex": 3,
179# JSON-EXPAND-64-NEXT:   "Relocs": [
180# JSON-EXPAND-64-NEXT:     {
181# JSON-EXPAND-64-NEXT:       "Relocation": {
182# JSON-EXPAND-64-NEXT:         "Offset": 0,
183# JSON-EXPAND-64-NEXT:         "Type": {
184# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_NONE",
185# JSON-EXPAND-64-NEXT:           "Value": 0
186# JSON-EXPAND-64-NEXT:         },
187# JSON-EXPAND-64-NEXT:         "Symbol": {
188# JSON-EXPAND-64-NEXT:           "Name": "rela_0",
189# JSON-EXPAND-64-NEXT:           "Value": 5
190# JSON-EXPAND-64-NEXT:         },
191# JSON-EXPAND-64-NEXT:         "Addend": 0
192# JSON-EXPAND-64-NEXT:       }
193# JSON-EXPAND-64-NEXT:     },
194# JSON-EXPAND-64-NEXT:     {
195# JSON-EXPAND-64-NEXT:       "Relocation": {
196# JSON-EXPAND-64-NEXT:         "Offset": 1,
197# JSON-EXPAND-64-NEXT:         "Type": {
198# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_PC32",
199# JSON-EXPAND-64-NEXT:           "Value": 2
200# JSON-EXPAND-64-NEXT:         },
201# JSON-EXPAND-64-NEXT:         "Symbol": {
202# JSON-EXPAND-64-NEXT:           "Name": "rela_neg",
203# JSON-EXPAND-64-NEXT:           "Value": 6
204# JSON-EXPAND-64-NEXT:         },
205# JSON-EXPAND-64-NEXT:         "Addend": 18446744073709551615
206# JSON-EXPAND-64-NEXT:       }
207# JSON-EXPAND-64-NEXT:     },
208# JSON-EXPAND-64-NEXT:     {
209# JSON-EXPAND-64-NEXT:       "Relocation": {
210# JSON-EXPAND-64-NEXT:         "Offset": 5,
211# JSON-EXPAND-64-NEXT:         "Type": {
212# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_PLT32",
213# JSON-EXPAND-64-NEXT:           "Value": 4
214# JSON-EXPAND-64-NEXT:         },
215# JSON-EXPAND-64-NEXT:         "Symbol": {
216# JSON-EXPAND-64-NEXT:           "Name": "rela_pos",
217# JSON-EXPAND-64-NEXT:           "Value": 7
218# JSON-EXPAND-64-NEXT:         },
219# JSON-EXPAND-64-NEXT:         "Addend": 2
220# JSON-EXPAND-64-NEXT:       }
221# JSON-EXPAND-64-NEXT:     },
222# JSON-EXPAND-64-NEXT:     {
223# JSON-EXPAND-64-NEXT:       "Relocation": {
224# JSON-EXPAND-64-NEXT:         "Offset": 18446744073709551615,
225# JSON-EXPAND-64-NEXT:         "Type": {
226# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_64",
227# JSON-EXPAND-64-NEXT:           "Value": 1
228# JSON-EXPAND-64-NEXT:         },
229# JSON-EXPAND-64-NEXT:         "Symbol": {
230# JSON-EXPAND-64-NEXT:           "Name": "rela_minneg",
231# JSON-EXPAND-64-NEXT:           "Value": 8
232# JSON-EXPAND-64-NEXT:         },
233# JSON-EXPAND-64-NEXT:         "Addend": 9223372036854775808
234# JSON-EXPAND-64-NEXT:       }
235# JSON-EXPAND-64-NEXT:     },
236# JSON-EXPAND-64-NEXT:     {
237# JSON-EXPAND-64-NEXT:       "Relocation": {
238# JSON-EXPAND-64-NEXT:         "Offset": 9,
239# JSON-EXPAND-64-NEXT:         "Type": {
240# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_32S",
241# JSON-EXPAND-64-NEXT:           "Value": 11
242# JSON-EXPAND-64-NEXT:         },
243# JSON-EXPAND-64-NEXT:         "Symbol": {
244# JSON-EXPAND-64-NEXT:           "Name": "rela_maxpos",
245# JSON-EXPAND-64-NEXT:           "Value": 9
246# JSON-EXPAND-64-NEXT:         },
247# JSON-EXPAND-64-NEXT:         "Addend": 9223372036854775807
248# JSON-EXPAND-64-NEXT:       }
249# JSON-EXPAND-64-NEXT:     }
250# JSON-EXPAND-64-NEXT:    ]
251# JSON-EXPAND-64-NEXT:  }
252# JSON-EXPAND-64-NEXT: ]
253
254--- !ELF
255FileHeader:
256  Class:   ELFCLASS64
257  Data:    ELFDATA2LSB
258  Type:    ET_REL
259  Machine: EM_X86_64
260Sections:
261  - Name: .text
262    Type: SHT_PROGBITS
263    Content: '00FFFFFFFF020000001234567890ABCDEF'
264  - Name:    .rel.text
265    Type:    SHT_REL
266    Info:    .text
267    Link:    [[LINK=.symtab]]
268    ShName:  [[SHNAME=<none>]]
269    EntSize: [[ENTSIZEREL=<none>]]
270    Relocations:
271      - Symbol: rel_0
272        Type:   R_X86_64_NONE
273      - Offset: 0x1
274        Symbol: rel_neg
275        Type:   R_X86_64_PC32
276      - Offset: 0x5
277        Symbol: rel_pos
278        Type:   R_X86_64_PLT32
279      - Offset: 0x9
280        Symbol: rel_64
281        Type:   R_X86_64_64
282  - Name:    .rela.text
283    Type:    SHT_RELA
284    Info:    .text
285    Link:    [[LINK=.symtab]]
286    ShName:  [[SHNAME=<none>]]
287    EntSize: [[ENTSIZERELA=<none>]]
288    Relocations:
289      - Symbol: rela_0
290        Type:   R_X86_64_NONE
291        Addend: 0
292      - Offset: 0x1
293        Symbol: rela_neg
294        Type:   R_X86_64_PC32
295        Addend: -1
296      - Offset: 0x5
297        Symbol: rela_pos
298        Type:   R_X86_64_PLT32
299        Addend: 2
300      - Offset: 0xFFFFFFFFFFFFFFFF
301        Symbol: rela_minneg
302        Type:   R_X86_64_64
303        Addend: -9223372036854775808 ## Min 64-bit signed.
304      - Offset: 0x9
305        Symbol: rela_maxpos
306        Type:   R_X86_64_32S
307        Addend: 9223372036854775807 ## Max 64-bit signed.
308Symbols:
309  - Name:    rel_0
310    Section: .text
311    Value:   0
312  - Name:     rel_neg
313    Section: .text
314    Value:   1
315  - Name:    rel_pos
316    Section: .text
317    Value:   2
318  - Name:    rel_64
319    Section: .text
320    Value:   0xFFFFFFFFFFFFFFFF
321  - Name:    rela_0
322    Section: .text
323    Value:   0
324  - Name:    rela_neg
325    Section: .text
326    Value:   1
327  - Name:    rela_pos
328    Section: .text
329    Value:   2
330  - Name:    rela_minneg
331    Section: .text
332    Value:   3
333  - Name:    rela_maxpos
334    Section: .text
335    Value:   0xFFFFFFFFFFFFFFFF
336
337## Check we report a warning when we are unable to dump relocations for a section.
338## Check we continue dumping other relocation sections if any.
339
340## Case A: check the case when relocations can't be read from an SHT_REL section.
341##         because of broken sh_entsize field.
342# RUN: yaml2obj %s --docnum=1 -DENTSIZEREL=1 -o %t.broken.rel
343# RUN: llvm-readobj --relocations %t.broken.rel 2>&1 \
344# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-LLVM
345# RUN: llvm-readelf --relocations %t.broken.rel 2>&1 \
346# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-GNU
347
348# BROKEN-REL-LLVM:      Relocations [
349# BROKEN-REL-LLVM-NEXT:   Section (2) .rel.text {
350# 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
351# BROKEN-REL-LLVM-NEXT:   }
352# BROKEN-REL-LLVM-NEXT:   Section (3) .rela.text {
353# BROKEN-REL-LLVM-NEXT:     0x0 R_X86_64_NONE rela_0 0x0
354# BROKEN-REL-LLVM-NEXT:     0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
355# BROKEN-REL-LLVM-NEXT:     0x5 R_X86_64_PLT32 rela_pos 0x2
356# BROKEN-REL-LLVM-NEXT:     0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
357# BROKEN-REL-LLVM-NEXT:     0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
358# BROKEN-REL-LLVM-NEXT:   }
359# BROKEN-REL-LLVM-NEXT: ]
360
361# BROKEN-REL-GNU:      Relocation section '.rel.text' at offset 0x51 contains 64 entries:
362# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
363# 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
364# BROKEN-REL-GNU:      Relocation section '.rela.text' at offset 0x91 contains 5 entries:
365# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
366# BROKEN-REL-GNU-NEXT: 0000000000000000  0000000500000000 R_X86_64_NONE  0000000000000000 rela_0 + 0
367# BROKEN-REL-GNU-NEXT: 0000000000000001  0000000600000002 R_X86_64_PC32  0000000000000001 rela_neg - 1
368# BROKEN-REL-GNU-NEXT: 0000000000000005  0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2
369# BROKEN-REL-GNU-NEXT: ffffffffffffffff  0000000800000001 R_X86_64_64    0000000000000003 rela_minneg - 8000000000000000
370# BROKEN-REL-GNU-NEXT: 0000000000000009  000000090000000b R_X86_64_32S   ffffffffffffffff rela_maxpos + 7fffffffffffffff
371
372## Case B: check the case when relocations can't be read from an SHT_RELA section.
373##         because of broken sh_entsize field.
374# RUN: yaml2obj %s --docnum=1 -DENTSIZERELA=1 -o %t.broken.rela
375# RUN: llvm-readobj --relocations %t.broken.rela 2>&1 \
376# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-LLVM
377# RUN: llvm-readelf --relocations %t.broken.rela 2>&1 \
378# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-GNU
379
380# BROKEN-RELA-LLVM:      Relocations [
381# BROKEN-RELA-LLVM-NEXT:   Section (2) .rel.text {
382# BROKEN-RELA-LLVM-NEXT:     0x0 R_X86_64_NONE rel_0{{$}}
383# BROKEN-RELA-LLVM-NEXT:     0x1 R_X86_64_PC32 rel_neg{{$}}
384# BROKEN-RELA-LLVM-NEXT:     0x5 R_X86_64_PLT32 rel_pos{{$}}
385# BROKEN-RELA-LLVM-NEXT:     0x9 R_X86_64_64 rel_64{{$}}
386# BROKEN-RELA-LLVM-NEXT:   }
387# BROKEN-RELA-LLVM-NEXT:   Section (3) .rela.text {
388# 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
389# BROKEN-RELA-LLVM-NEXT:   }
390# BROKEN-RELA-LLVM-NEXT: ]
391
392# BROKEN-RELA-GNU:      Relocation section '.rel.text' at offset 0x51 contains 4 entries:
393# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
394# BROKEN-RELA-GNU-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE  0000000000000000 rel_0
395# BROKEN-RELA-GNU-NEXT: 0000000000000001  0000000200000002 R_X86_64_PC32  0000000000000001 rel_neg
396# BROKEN-RELA-GNU-NEXT: 0000000000000005  0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos
397# BROKEN-RELA-GNU-NEXT: 0000000000000009  0000000400000001 R_X86_64_64    ffffffffffffffff rel_64
398# BROKEN-RELA-GNU-EMPTY:
399# BROKEN-RELA-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 120 entries:
400# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
401# 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
402
403## Case C: check the case when relocations can't be read from SHT_REL/SHT_RELA sections
404##         because of broken sh_link fields.
405# RUN: yaml2obj %s --docnum=1 -DLINK=0xffff -o %t.broken.link
406# RUN: llvm-readobj --relocations %t.broken.link 2>&1 \
407# RUN:   | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-LLVM
408# RUN: llvm-readelf --relocations %t.broken.link 2>&1 \
409# RUN:   | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-GNU
410
411# BROKEN-LINK-LLVM:      Relocations [
412# BROKEN-LINK-LLVM-NEXT:   Section (2) .rel.text {
413# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
414# BROKEN-LINK-LLVM-NEXT:   }
415# BROKEN-LINK-LLVM-NEXT:   Section (3) .rela.text {
416# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
417# BROKEN-LINK-LLVM-NEXT:   }
418# BROKEN-LINK-LLVM-NEXT: ]
419
420# BROKEN-LINK-GNU:      Relocation section '.rel.text' at offset 0x51 contains 4 entries:
421# BROKEN-LINK-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name
422# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
423# BROKEN-LINK-GNU-EMPTY:
424# BROKEN-LINK-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 5 entries:
425# BROKEN-LINK-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
426# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
427
428## Show that ELF32 is dumped correctly.
429# RUN: yaml2obj %s --docnum=2 -o %t32
430# RUN: llvm-readobj -r %t32 \
431# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
432# RUN: llvm-readobj --relocs %t32 \
433# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
434# RUN: llvm-readobj --relocations %t32 \
435# RUN:   | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines
436
437#      LLVM-32:Relocations [
438# LLVM-32-NEXT:  Section (2) .rel.text {
439# LLVM-32-NEXT:    0x0 R_386_NONE rel_0
440# LLVM-32-NEXT:    0x1 R_386_PC32 rel_neg
441# LLVM-32-NEXT:    0x5 R_386_PLT32 rel_pos
442# LLVM-32-NEXT:  }
443# LLVM-32-NEXT:  Section (3) .rela.text {
444# LLVM-32-NEXT:    0x0 R_386_NONE rela_0 0x0
445# LLVM-32-NEXT:    0x1 R_386_PC32 rela_neg 0xFFFFFFFF
446# LLVM-32-NEXT:    0x5 R_386_PLT32 rela_pos 0x2
447# LLVM-32-NEXT:    0xFFFFFFFF R_386_32 rela_minneg 0x80000000
448# LLVM-32-NEXT:    0x9 R_386_GOT32 rela_maxpos 0x7FFFFFFF
449# LLVM-32-NEXT:  }
450# LLVM-32-NEXT:]
451
452# RUN: llvm-readelf -r %t32 \
453# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
454# RUN: llvm-readelf --relocs %t32 \
455# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
456# RUN: llvm-readelf --relocations %t32 \
457# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
458
459#      GNU-32:Relocation section '.rel.text' at offset 0x3d contains 3 entries:
460# GNU-32-NEXT: Offset     Info    Type                Sym. Value  Symbol's Name
461# GNU-32-NEXT:00000000  00000100 R_386_NONE             00000000   rel_0
462# GNU-32-NEXT:00000001  00000202 R_386_PC32             00000001   rel_neg
463# GNU-32-NEXT:00000005  00000304 R_386_PLT32            ffffffff   rel_pos
464# GNU-32-EMPTY:
465# GNU-32-NEXT:Relocation section '.rela.text' at offset 0x55 contains 5 entries:
466# GNU-32-NEXT: Offset     Info    Type                Sym. Value  Symbol's Name + Addend
467# GNU-32-NEXT:00000000  00000400 R_386_NONE             00000000   rela_0 + 0
468# GNU-32-NEXT:00000001  00000502 R_386_PC32             00000001   rela_neg - 1
469# GNU-32-NEXT:00000005  00000604 R_386_PLT32            00000002   rela_pos + 2
470# GNU-32-NEXT:ffffffff  00000701 R_386_32               00000003   rela_minneg - 80000000
471# GNU-32-NEXT:00000009  00000803 R_386_GOT32            ffffffff   rela_maxpos + 7fffffff
472
473## Show that --expand-relocs expands the relocation dump for LLVM style and not GNU.
474# RUN: llvm-readobj -r --expand-relocs %t32 \
475# RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-32 --strict-whitespace --match-full-lines
476# RUN: llvm-readelf -r --expand-relocs %t32 \
477# RUN:   | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines
478
479#      LLVM-EXPAND-32:Relocations [
480# LLVM-EXPAND-32-NEXT:  Section (2) .rel.text {
481# LLVM-EXPAND-32-NEXT:    Relocation {
482# LLVM-EXPAND-32-NEXT:      Offset: 0x0
483# LLVM-EXPAND-32-NEXT:      Type: R_386_NONE (0)
484# LLVM-EXPAND-32-NEXT:      Symbol: rel_0 (1)
485# LLVM-EXPAND-32-NEXT:    }
486# LLVM-EXPAND-32-NEXT:    Relocation {
487# LLVM-EXPAND-32-NEXT:      Offset: 0x1
488# LLVM-EXPAND-32-NEXT:      Type: R_386_PC32 (2)
489# LLVM-EXPAND-32-NEXT:      Symbol: rel_neg (2)
490# LLVM-EXPAND-32-NEXT:    }
491# LLVM-EXPAND-32-NEXT:    Relocation {
492# LLVM-EXPAND-32-NEXT:      Offset: 0x5
493# LLVM-EXPAND-32-NEXT:      Type: R_386_PLT32 (4)
494# LLVM-EXPAND-32-NEXT:      Symbol: rel_pos (3)
495# LLVM-EXPAND-32-NEXT:    }
496# LLVM-EXPAND-32-NEXT:  }
497# LLVM-EXPAND-32-NEXT:  Section (3) .rela.text {
498# LLVM-EXPAND-32-NEXT:    Relocation {
499# LLVM-EXPAND-32-NEXT:      Offset: 0x0
500# LLVM-EXPAND-32-NEXT:      Type: R_386_NONE (0)
501# LLVM-EXPAND-32-NEXT:      Symbol: rela_0 (4)
502# LLVM-EXPAND-32-NEXT:      Addend: 0x0
503# LLVM-EXPAND-32-NEXT:    }
504# LLVM-EXPAND-32-NEXT:    Relocation {
505# LLVM-EXPAND-32-NEXT:      Offset: 0x1
506# LLVM-EXPAND-32-NEXT:      Type: R_386_PC32 (2)
507# LLVM-EXPAND-32-NEXT:      Symbol: rela_neg (5)
508# LLVM-EXPAND-32-NEXT:      Addend: 0xFFFFFFFF
509# LLVM-EXPAND-32-NEXT:    }
510# LLVM-EXPAND-32-NEXT:    Relocation {
511# LLVM-EXPAND-32-NEXT:      Offset: 0x5
512# LLVM-EXPAND-32-NEXT:      Type: R_386_PLT32 (4)
513# LLVM-EXPAND-32-NEXT:      Symbol: rela_pos (6)
514# LLVM-EXPAND-32-NEXT:      Addend: 0x2
515# LLVM-EXPAND-32-NEXT:    }
516# LLVM-EXPAND-32-NEXT:    Relocation {
517# LLVM-EXPAND-32-NEXT:      Offset: 0xFFFFFFFF
518# LLVM-EXPAND-32-NEXT:      Type: R_386_32 (1)
519# LLVM-EXPAND-32-NEXT:      Symbol: rela_minneg (7)
520# LLVM-EXPAND-32-NEXT:      Addend: 0x80000000
521# LLVM-EXPAND-32-NEXT:    }
522# LLVM-EXPAND-32-NEXT:    Relocation {
523# LLVM-EXPAND-32-NEXT:      Offset: 0x9
524# LLVM-EXPAND-32-NEXT:      Type: R_386_GOT32 (3)
525# LLVM-EXPAND-32-NEXT:      Symbol: rela_maxpos (8)
526# LLVM-EXPAND-32-NEXT:      Addend: 0x7FFFFFFF
527# LLVM-EXPAND-32-NEXT:    }
528# LLVM-EXPAND-32-NEXT:  }
529# LLVM-EXPAND-32-NEXT:]
530
531--- !ELF
532FileHeader:
533  Class:   ELFCLASS32
534  Data:    ELFDATA2LSB
535  Type:    ET_REL
536  Machine: EM_386
537Sections:
538  - Name: .text
539    Type: SHT_PROGBITS
540    Content: '00FFFFFFFF02000000'
541  - Name: .rel.text
542    Type: SHT_REL
543    Info: .text
544    Relocations:
545      - Symbol: rel_0
546        Type:   R_386_NONE
547      - Offset: 0x1
548        Symbol: rel_neg
549        Type:   R_386_PC32
550      - Offset: 0x5
551        Symbol: rel_pos
552        Type:   R_386_PLT32
553  - Name: .rela.text
554    Type: SHT_RELA
555    Info: .text
556    Relocations:
557      - Symbol: rela_0
558        Type:   R_386_NONE
559        Addend: 0
560      - Offset: 0x1
561        Symbol: rela_neg
562        Type:   R_386_PC32
563        Addend: -1
564      - Offset: 0x5
565        Symbol: rela_pos
566        Type:   R_386_PLT32
567        Addend: 2
568      - Offset: 0xFFFFFFFF
569        Symbol: rela_minneg
570        Type:   R_386_32
571        Addend: -2147483648 ## Min 32-bit signed.
572      - Offset: 0x9
573        Symbol: rela_maxpos
574        Type:   R_386_GOT32
575        Addend: 2147483647 ## Max 32-bit signed.
576Symbols:
577  - Name:    rel_0
578    Section: .text
579    Value:   0
580  - Name:    rel_neg
581    Section: .text
582    Value:   1
583  - Name:    rel_pos
584    Section: .text
585    Value:   0xFFFFFFFF
586  - Name:    rela_0
587    Section: .text
588    Value:   0
589  - Name:    rela_neg
590    Section: .text
591    Value:   1
592  - Name:    rela_pos
593    Section: .text
594    Value:   2
595  - Name:    rela_minneg
596    Section: .text
597    Value:   3
598  - Name:    rela_maxpos
599    Section: .text
600    Value:   0xFFFFFFFF
601
602## Check we report a warning when the name of a relocation section can't be read. Check we continue dumping.
603# RUN: yaml2obj %s --docnum=1 -DSHNAME=0xffffffff -o %tshname
604# RUN: llvm-readobj --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=LLVM-SHNAME
605# RUN: llvm-readelf --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=GNU-SHNAME
606
607# LLVM-SHNAME:      Relocations [
608# 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
609# LLVM-SHNAME-NEXT:   Section (2) <?> {
610# LLVM-SHNAME-NEXT:     0x0 R_X86_64_NONE rel_0{{$}}
611# LLVM-SHNAME-NEXT:     0x1 R_X86_64_PC32 rel_neg{{$}}
612# LLVM-SHNAME-NEXT:     0x5 R_X86_64_PLT32 rel_pos{{$}}
613# LLVM-SHNAME-NEXT:     0x9 R_X86_64_64 rel_64{{$}}
614# LLVM-SHNAME-NEXT:   }
615# 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
616# LLVM-SHNAME-NEXT:   Section (3) <?> {
617# LLVM-SHNAME-NEXT:     0x0 R_X86_64_NONE rela_0 0x0
618# LLVM-SHNAME-NEXT:     0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
619# LLVM-SHNAME-NEXT:     0x5 R_X86_64_PLT32 rela_pos 0x2
620# LLVM-SHNAME-NEXT:     0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
621# LLVM-SHNAME-NEXT:     0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
622# LLVM-SHNAME-NEXT:   }
623# LLVM-SHNAME-NEXT: ]
624
625# 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
626# GNU-SHNAME:      Relocation section '<?>' at offset 0x51 contains 4 entries:
627# GNU-SHNAME-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name
628# GNU-SHNAME-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 rel_0
629# GNU-SHNAME-NEXT: 0000000000000001  0000000200000002 R_X86_64_PC32          0000000000000001 rel_neg
630# GNU-SHNAME-NEXT: 0000000000000005  0000000300000004 R_X86_64_PLT32         0000000000000002 rel_pos
631# GNU-SHNAME-NEXT: 0000000000000009  0000000400000001 R_X86_64_64            ffffffffffffffff rel_64
632# 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
633# GNU-SHNAME:      Relocation section '<?>' at offset 0x91 contains 5 entries:
634# GNU-SHNAME-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name + Addend
635# GNU-SHNAME-NEXT: 0000000000000000  0000000500000000 R_X86_64_NONE  0000000000000000 rela_0 + 0
636# GNU-SHNAME-NEXT: 0000000000000001  0000000600000002 R_X86_64_PC32  0000000000000001 rela_neg - 1
637# GNU-SHNAME-NEXT: 0000000000000005  0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2
638# GNU-SHNAME-NEXT: ffffffffffffffff  0000000800000001 R_X86_64_64    0000000000000003 rela_minneg - 8000000000000000
639# GNU-SHNAME-NEXT: 0000000000000009  000000090000000b R_X86_64_32S   ffffffffffffffff rela_maxpos + 7fffffffffffffff
640
641## Check that we report a warning when a relocation has a
642## symbol index past the end of the symbol table
643
644# RUN: yaml2obj %s --docnum=3 -o %t3
645# RUN: llvm-readobj --relocs %t3 2>&1 | \
646# RUN:   FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=LLVM-SYMNDX
647# RUN: llvm-readelf --relocs %t3 2>&1 | \
648# RUN:   FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=GNU-SYMNDX
649
650# LLVM-SYMNDX:      Relocations [
651# LLVM-SYMNDX-NEXT:   Section (1) .rela.text {
652# 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)
653# 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)
654# LLVM-SYMNDX-NEXT:   }
655# LLVM-SYMNDX-NEXT: ]
656
657# GNU-SYMNDX:      Relocation section '.rela.text' at offset 0x40 contains 2 entries:
658# GNU-SYMNDX-NEXT:     Offset             Info             Type     Symbol's Value  Symbol's Name + Addend
659# 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)
660# 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)
661
662--- !ELF
663FileHeader:
664  Class:   ELFCLASS64
665  Data:    ELFDATA2LSB
666  Type:    ET_DYN
667  Machine: EM_X86_64
668Sections:
669  - Name: .rela.text
670    Type: SHT_RELA
671    Relocations:
672      - Type:   R_X86_64_NONE
673        Symbol: 0x2
674      - Type:   R_X86_64_NONE
675        Symbol: 0x3
676Symbols:
677  - Name: foo
678