1 ## Test how we handle cases when dynamic relocations or corresponding dynamic tags are broken.
3 ## Check that llvm-readobj/llvm-readelf reports an error when dumping relocations if a dynamic
4 ## symbol name offset is broken (goes past the end of the dynamic symbol string table).
6 # RUN: yaml2obj --docnum=1 %s -o %t1
7 # RUN: llvm-readobj --dyn-relocations %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=LLVM
8 # RUN: llvm-readelf --dyn-relocations %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=GNU
10 # LLVM: Dynamic Relocations {
11 # LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1
12 # LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
15 # GNU: 'RELA' relocation section at offset {{.+}} contains 24 bytes:
16 # GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
17 # GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1
18 # GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 <corrupt> + 0
31 - Symbol: 1 ## Index of a dynamic symbol with a broken st_name.
37 Value: 0x0000000000000000
39 Value: 0x0000000000000018
41 Value: 0x0000000000000018
43 Value: 0x0000000000000000
51 ## Show we print a warning for an invalid relocation table size stored in a DT_RELASZ entry.
53 ## Case A: the size of a single relocation entry is 0x18. In this case 0xFF % 0x18 != 0 and we report a warning
55 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELA -DTAG1=DT_RELASZ -DTAG1VAL=0xFF -DTAG2=DT_RELAENT %s -o %t2a
56 # RUN: llvm-readobj --dyn-relocations %t2a 2>&1 | \
57 # RUN: FileCheck %s -DFILE=%t2a --check-prefix=INVALID-DT-RELASZ1 --implicit-check-not=warning:
58 # RUN: llvm-readelf --dyn-relocations %t2a 2>&1 | \
59 # RUN: FileCheck %s -DFILE=%t2a --check-prefix=INVALID-DT-RELASZ1 --implicit-check-not=warning:
61 # INVALID-DT-RELASZ1: warning: '[[FILE]]': invalid DT_RELASZ value (0xff) or DT_RELAENT value (0x18)
77 Value: [[TAG1VAL=0x18]]
79 Value: [[TAG2VAL=0x18]]
88 ## Case B: the DT_RELASZ has value of 0x251, what is too large, because the relocation table goes past the EOF.
90 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELA -DTAG1=DT_RELASZ -DTAG1VAL=0x251 -DTAG2=DT_RELAENT %s -o %t2b
91 # RUN: llvm-readobj --dyn-relocations %t2b 2>&1 | \
92 # RUN: FileCheck %s -DFILE=%t2b --check-prefix=INVALID-DT-RELASZ2 --implicit-check-not=warning:
93 # RUN: llvm-readelf --dyn-relocations %t2b 2>&1 | \
94 # RUN: FileCheck %s -DFILE=%t2b --check-prefix=INVALID-DT-RELASZ2 --implicit-check-not=warning:
96 # INVALID-DT-RELASZ2: warning: '[[FILE]]': unable to read data at 0x78 of size 0x251 (DT_RELASZ value): it goes past the end of the file of size 0x2c8
98 ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELAENT entry.
99 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELA -DTAG1=DT_RELASZ -DTAG2=DT_RELAENT -DTAG2VAL=0xFF %s -o %t3
100 # RUN: llvm-readobj --dyn-relocations %t3 2>&1 | \
101 # RUN: FileCheck %s -DFILE=%t3 --check-prefix=INVALID-DT-RELAENT --implicit-check-not=warning:
102 # RUN: llvm-readelf --dyn-relocations %t3 2>&1 | \
103 # RUN: FileCheck %s -DFILE=%t3 --check-prefix=INVALID-DT-RELAENT --implicit-check-not=warning:
105 # INVALID-DT-RELAENT: warning: '[[FILE]]': invalid DT_RELASZ value (0x18) or DT_RELAENT value (0xff)
107 ## Show we print a warning for an invalid relocation table size stored in a DT_RELSZ entry.
109 ## Case A: the size of a single relocation entry is 0x18. In this case 0xFF % 0x18 != 0 and we report a warning.
111 # RUN: yaml2obj --docnum=2 -DRELTYPE=REL -DTAG1=DT_RELSZ -DTAG1VAL=0xFF -DTAG2=DT_RELENT %s -o %t4a
112 # RUN: llvm-readobj --dyn-relocations %t4a 2>&1 | FileCheck %s -DFILE=%t4a --check-prefix=INVALID-DT-RELSZ1
113 # RUN: llvm-readelf --dyn-relocations %t4a 2>&1 | FileCheck %s -DFILE=%t4a --check-prefix=INVALID-DT-RELSZ1
115 # INVALID-DT-RELSZ1: warning: '[[FILE]]': invalid DT_RELSZ value (0xff) or DT_RELENT value (0x18)
117 ## Case B: the DT_RELSZ has value of 0x251, what is too large, because the relocation table goes past the EOF.
119 # RUN: yaml2obj --docnum=2 -DRELTYPE=REL -DTAG1=DT_RELSZ -DTAG1VAL=0x251 -DTAG2=DT_RELENT %s -o %t4b
120 # RUN: llvm-readobj --dyn-relocations %t4b 2>&1 | FileCheck %s -DFILE=%t4b --check-prefix=INVALID-DT-RELSZ2
121 # RUN: llvm-readelf --dyn-relocations %t4b 2>&1 | FileCheck %s -DFILE=%t4b --check-prefix=INVALID-DT-RELSZ2
123 # INVALID-DT-RELSZ2: warning: '[[FILE]]': unable to read data at 0x78 of size 0x251 (DT_RELSZ value): it goes past the end of the file of size 0x2c8
125 ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELENT entry.
126 # RUN: yaml2obj --docnum=2 -DRELTYPE=REL -DTAG1=DT_RELSZ -DTAG2=DT_RELENT -DTAG2VAL=0xFF %s -o %t5
127 # RUN: llvm-readobj --dyn-relocations %t5 2>&1 | FileCheck %s -DFILE=%t5 --check-prefix=INVALID-DT-RELENT
128 # RUN: llvm-readelf --dyn-relocations %t5 2>&1 | FileCheck %s -DFILE=%t5 --check-prefix=INVALID-DT-RELENT
130 # INVALID-DT-RELENT: warning: '[[FILE]]': invalid DT_RELSZ value (0x18) or DT_RELENT value (0xff)
132 ## Show we print a warning for an invalid relocation table size stored in a DT_RELRSZ/DT_ANDROID_RELRSZ entry.
133 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELR -DTAG1=DT_RELRSZ -DTAG1VAL=0xFF -DTAG2=DT_RELRENT %s -o %t6
134 # RUN: llvm-readobj --dyn-relocations %t6 2>&1 | FileCheck %s -DFILE=%t6 --check-prefix=INVALID-DT-RELRSZ
135 # RUN: llvm-readelf --dyn-relocations %t6 2>&1 | FileCheck %s -DFILE=%t6 --check-prefix=INVALID-DT-RELRSZ
137 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELR -DTAG1=DT_ANDROID_RELRSZ -DTAG1VAL=0xFF -DTAG2=DT_ANDROID_RELRENT %s -o %t7
138 # RUN: llvm-readobj --dyn-relocations %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DT-ANDROID-RELRSZ
139 # RUN: llvm-readelf --dyn-relocations %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DT-ANDROID-RELRSZ
141 # INVALID-DT-RELRSZ: warning: '[[FILE]]': invalid DT_RELRSZ value (0xff) or DT_RELRENT value (0x18)
142 # INVALID-DT-ANDROID-RELRSZ: warning: '[[FILE]]': invalid DT_ANDROID_RELRSZ value (0xff) or DT_ANDROID_RELRENT value (0x18)
144 ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELRENT/DT_ANDROID_RELRENT entry.
145 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELR -DTAG1=DT_RELRSZ -DTAG2=DT_RELRENT -DTAG2VAL=0xFF %s -o %t8
146 # RUN: llvm-readobj --dyn-relocations %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=INVALID-DT-RELRENT
147 # RUN: llvm-readelf --dyn-relocations %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=INVALID-DT-RELRENT
148 # RUN: yaml2obj --docnum=2 -DRELTYPE=RELR -DTAG1=DT_ANDROID_RELRSZ -DTAG2=DT_ANDROID_RELRENT -DTAG2VAL=0xFF %s -o %t9
149 # RUN: llvm-readobj --dyn-relocations %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=INVALID-DT-ANDROID-RELRENT
150 # RUN: llvm-readelf --dyn-relocations %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=INVALID-DT-ANDROID-RELRENT
152 # INVALID-DT-RELRENT: invalid DT_RELRSZ value (0x18) or DT_RELRENT value (0xff)
153 # INVALID-DT-ANDROID-RELRENT: invalid DT_ANDROID_RELRSZ value (0x18) or DT_ANDROID_RELRENT value (0xff)
155 ## Show we print a warning for an invalid value of DT_PLTRELSZ, which describes the total size
156 ## of the relocation entries associated with the procedure linkage table.
158 ## Case A: the size of a single relocation entry is 0x18. In this case 0xFF % 0x18 != 0 and we report a warning.
160 # RUN: yaml2obj --docnum=3 -DVAL=0xFF %s -o %t10a
161 # RUN: llvm-readobj --dyn-relocations %t10a 2>&1 | \
162 # RUN: FileCheck %s -DFILE=%t10a --check-prefix=INVALID-DT-PLTRELSZ1 --implicit-check-not=warning:
163 # RUN: llvm-readelf --dyn-relocations %t10a 2>&1 | \
164 # RUN: FileCheck %s -DFILE=%t10a --check-prefix=INVALID-DT-PLTRELSZ1 --implicit-check-not=warning:
166 # INVALID-DT-PLTRELSZ1: warning: '[[FILE]]': invalid DT_PLTRELSZ value (0xff) or PLTREL entry size (0x18){{$}}
178 - Type: R_X86_64_NONE
185 Value: [[VAL]] ## The valid value would be 0x18.
187 Value: 0x7 ## DT_RELA
196 ## Case B: the DT_PLTRELSZ (PLT size) has value of 0x269, what is too large, because PLT goes past the EOF.
198 # RUN: yaml2obj --docnum=3 -DVAL=0x269 %s -o %t10b
199 # RUN: llvm-readobj --dyn-relocations %t10b 2>&1 | \
200 # RUN: FileCheck %s -DFILE=%t10b --check-prefix=INVALID-DT-PLTRELSZ2-LLVM --implicit-check-not=warning:
201 # RUN: llvm-readelf --dyn-relocations %t10b 2>&1 | \
202 # RUN: FileCheck %s -DFILE=%t10b --check-prefix=INVALID-DT-PLTRELSZ2-GNU --implicit-check-not=warning:
204 # INVALID-DT-PLTRELSZ2-LLVM: Dynamic Relocations {
205 # INVALID-DT-PLTRELSZ2-LLVM-NEXT: warning: '[[FILE]]': unable to read data at 0x78 of size 0x269 (DT_PLTRELSZ value): it goes past the end of the file of size 0x2e0
206 # INVALID-DT-PLTRELSZ2-LLVM-NEXT: }
208 # INVALID-DT-PLTRELSZ2-GNU: 'PLT' relocation section at offset 0x78 contains 617 bytes:
209 # INVALID-DT-PLTRELSZ2-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
210 # INVALID-DT-PLTRELSZ2-GNU-NEXT: warning: '[[FILE]]': unable to read data at 0x78 of size 0x269 (DT_PLTRELSZ value): it goes past the end of the file of size 0x2e0
212 ## Show we print a warning when dumping dynamic relocations if there is no dynamic symbol table.
213 # RUN: yaml2obj --docnum=4 %s -o %t11
214 # RUN: llvm-readobj --dyn-relocations %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=LLVM-NO-DYNSYM
215 # RUN: llvm-readelf --dyn-relocations %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=GNU-NO-DYNSYM
217 # LLVM-NO-DYNSYM: Dynamic Relocations {
218 # LLVM-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 0: no dynamic symbol table found
219 # LLVM-NO-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
220 # LLVM-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: no dynamic symbol table found
221 # LLVM-NO-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
222 # LLVM-NO-DYNSYM-NEXT: }
224 # GNU-NO-DYNSYM: 'RELA' relocation section at offset 0x78 contains 48 bytes:
225 # GNU-NO-DYNSYM-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
226 # GNU-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 0: no dynamic symbol table found
227 # GNU-NO-DYNSYM-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE <corrupt> + 0
228 # GNU-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: no dynamic symbol table found
229 # GNU-NO-DYNSYM-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE <corrupt> + 0
241 - Type: R_X86_64_NONE
242 - Type: R_X86_64_NONE
260 ## Show we print a warning when the symbol index of a dynamic relocation is too
261 ## large (goes past the end of the dynamic symbol table).
262 # RUN: yaml2obj --docnum=5 %s -o %t12
263 # RUN: llvm-readobj --dyn-relocations %t12 2>&1 | \
264 # RUN: FileCheck %s -DFILE=%t12 --implicit-check-not=warning: --check-prefix=LLVM-INVALID-DYNSYM
265 # RUN: llvm-readelf --dyn-relocations %t12 2>&1 | \
266 # RUN: FileCheck %s -DFILE=%t12 --implicit-check-not=warning: --check-prefix=GNU-INVALID-DYNSYM
268 # LLVM-INVALID-DYNSYM: Dynamic Relocations {
269 # LLVM-INVALID-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 2: index is greater than or equal to the number of dynamic symbols (2)
270 # LLVM-INVALID-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
271 # LLVM-INVALID-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
272 # LLVM-INVALID-DYNSYM-NEXT: }
274 # GNU-INVALID-DYNSYM: 'RELA' relocation section at offset 0x78 contains 48 bytes:
275 # GNU-INVALID-DYNSYM-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
276 # GNU-INVALID-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 2: index is greater than or equal to the number of dynamic symbols (2)
277 # GNU-INVALID-DYNSYM-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE <corrupt> + 0
278 # GNU-INVALID-DYNSYM-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE <corrupt> + 0
290 - Type: R_X86_64_NONE
292 - Type: R_X86_64_NONE
312 ## Show that when we have both REL and RELA relocations, we dump both sets.
313 # RUN: yaml2obj --docnum=6 %s -o %t13
314 # RUN: llvm-readobj --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-LLVM
315 # RUN: llvm-readelf --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-GNU
317 # BOTH-RELA-REL-LLVM: Dynamic Relocations {
318 # BOTH-RELA-REL-LLVM-NEXT: 0x1 R_X86_64_NONE - 0x0{{$}}
319 # BOTH-RELA-REL-LLVM-NEXT: 0x2 R_X86_64_NONE -{{$}}
320 # BOTH-RELA-REL-LLVM-NEXT: }
322 # BOTH-RELA-REL-GNU: 'RELA' relocation section at offset 0x78 contains 24 bytes:
323 # BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
324 # BOTH-RELA-REL-GNU-NEXT: 0000000000000001 0000000000000000 R_X86_64_NONE 0
325 # BOTH-RELA-REL-GNU-EMPTY:
326 # BOTH-RELA-REL-GNU: 'REL' relocation section at offset 0x90 contains 16 bytes:
327 # BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
328 # BOTH-RELA-REL-GNU-NEXT: 0000000000000002 0000000000000000 R_X86_64_NONE
340 - Type: R_X86_64_NONE
345 - Type: R_X86_64_NONE
356 ## 0x18 == offset of .rel.dyn == size of .rela.dyn section.
371 ## Check that llvm-readobj/llvm-readelf reports a warning when dumping a relocation
372 ## which refers to a symbol past the end of the file.
374 # RUN: yaml2obj --docnum=7 %s -o %t7
375 # RUN: llvm-readobj --dyn-relocations %t7 2>&1 | \
376 # RUN: FileCheck %s -DFILE=%t7 --check-prefix=PAST-EOF-LLVM
377 # RUN: llvm-readelf --dyn-relocations %t7 2>&1 | \
378 # RUN: FileCheck %s -DFILE=%t7 --check-prefix=PAST-EOF-GNU
380 # PAST-EOF-LLVM: Dynamic Relocations {
381 # PAST-EOF-LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1) is past the end of the string table of size 0x0
382 # PAST-EOF-LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
383 # PAST-EOF-LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 2: symbol at 0x330 goes past the end of the file (0x330)
384 # PAST-EOF-LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
385 # PAST-EOF-LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 4294967295: symbol at 0x18000002e8 goes past the end of the file (0x330)
386 # PAST-EOF-LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
387 # PAST-EOF-LLVM-NEXT: }
389 # PAST-EOF-GNU: 'RELA' relocation section at offset 0x200 contains 72 bytes:
390 # PAST-EOF-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
391 # PAST-EOF-GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1) is past the end of the string table of size 0x0
392 # PAST-EOF-GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 <corrupt> + 0
393 # PAST-EOF-GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 2: symbol at 0x330 goes past the end of the file (0x330)
394 # PAST-EOF-GNU-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE <corrupt> + 0
395 # PAST-EOF-GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 4294967295: symbol at 0x18000002e8 goes past the end of the file (0x330)
396 # PAST-EOF-GNU-NEXT: 0000000000000000 ffffffff00000000 R_X86_64_NONE <corrupt> + 0
427 ## This symbol is located right before the EOF, so we can dump it.
430 ## The next symbol, which goes past the EOF.
433 ## One more symbol that goes past the EOF
434 ## with the maximal possible index.
437 ## Place all implicit sections here to make the .dynsym section to be the
438 ## last in the file. This makes the task of validating offsets a bit easier.
450 - Type: SectionHeaderTable
463 ## Show we print a warning for an invalid relocation table size stored in a DT_AARCH64_AUTH_RELRSZ entry.
464 # RUN: yaml2obj --docnum=8 -DRELTYPE=RELR -DTAG1=DT_AARCH64_AUTH_RELRSZ -DTAG1VAL=0xFF -DTAG2=DT_AARCH64_AUTH_RELRENT %s -o %t14
465 # RUN: llvm-readobj --dyn-relocations %t14 2>&1 | FileCheck %s -DFILE=%t14 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRSZ
466 # RUN: llvm-readelf --dyn-relocations %t14 2>&1 | FileCheck %s -DFILE=%t14 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRSZ
468 # INVALID-DT-AARCH64-AUTH-RELRSZ: warning: '[[FILE]]': invalid DT_AARCH64_AUTH_RELRSZ value (0xff) or DT_AARCH64_AUTH_RELRENT value (0x18)
470 ## Show we print a warning for an invalid relocation table entry size stored in a DT_AARCH64_AUTH_RELRENT entry.
471 # RUN: yaml2obj --docnum=8 -DRELTYPE=RELR -DTAG1=DT_AARCH64_AUTH_RELRSZ -DTAG2=DT_AARCH64_AUTH_RELRENT -DTAG2VAL=0xFF %s -o %t15
472 # RUN: llvm-readobj --dyn-relocations %t15 2>&1 | FileCheck %s -DFILE=%t15 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRENT
473 # RUN: llvm-readelf --dyn-relocations %t15 2>&1 | FileCheck %s -DFILE=%t15 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRENT
475 # INVALID-DT-AARCH64-AUTH-RELRENT: invalid DT_AARCH64_AUTH_RELRSZ value (0x18) or DT_AARCH64_AUTH_RELRENT value (0xff)
485 Type: SHT_[[RELTYPE]]
489 - Tag: DT_[[RELTYPE]]
492 Value: [[TAG1VAL=0x18]]
494 Value: [[TAG2VAL=0x18]]