| ## Test how we handle cases when dynamic relocations or corresponding dynamic tags are broken. |
| |
| ## Check that llvm-readobj/llvm-readelf reports an error when dumping relocations if a dynamic |
| ## symbol name offset is broken (goes past the end of the dynamic symbol string table). |
| |
| # RUN: yaml2obj --docnum=1 %s -o %t1 |
| # RUN: llvm-readobj --dyn-relocations %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=LLVM |
| # RUN: llvm-readelf --dyn-relocations %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=GNU |
| |
| # LLVM: Dynamic Relocations { |
| # 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 |
| # LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0 |
| # LLVM-NEXT: } |
| |
| # GNU: 'RELA' relocation section at offset {{.+}} contains 24 bytes: |
| # GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| # 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 |
| # GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 <corrupt> + 0 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Link: .dynsym |
| Relocations: |
| - Symbol: 1 ## Index of a dynamic symbol with a broken st_name. |
| Type: R_X86_64_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0000000000000000 |
| - Tag: DT_RELASZ |
| Value: 0x0000000000000018 |
| - Tag: DT_RELAENT |
| Value: 0x0000000000000018 |
| - Tag: DT_NULL |
| Value: 0x0000000000000000 |
| DynamicSymbols: |
| - StName: 0x1234 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table size stored in a DT_RELASZ entry. |
| # RUN: yaml2obj --docnum=2 %s -o %t2 |
| # RUN: llvm-readobj --dyn-relocations %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=INVALID-DT-RELASZ |
| # RUN: llvm-readelf --dyn-relocations %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=INVALID-DT-RELASZ |
| |
| # INVALID-DT-RELASZ: warning: '[[FILE]]': invalid DT_RELASZ value (0xff) or DT_RELAENT value (0x18) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0 |
| - Tag: DT_RELASZ |
| Value: 0xFF |
| - Tag: DT_RELAENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELAENT entry. |
| # RUN: yaml2obj --docnum=3 %s -o %t3 |
| # RUN: llvm-readobj --dyn-relocations %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=INVALID-DT-RELAENT |
| # RUN: llvm-readelf --dyn-relocations %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=INVALID-DT-RELAENT |
| |
| ## INVALID-DT-RELAENT: warning: '[[FILE]]': invalid DT_RELASZ value (0x18) or DT_RELAENT value (0xff) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0 |
| - Tag: DT_RELASZ |
| Value: 0x18 |
| - Tag: DT_RELAENT |
| Value: 0xFF |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table size stored in a DT_RELSZ entry. |
| # RUN: yaml2obj --docnum=4 %s -o %t4 |
| # RUN: llvm-readobj --dyn-relocations %t4 2>&1 | FileCheck %s -DFILE=%t4 --check-prefix=INVALID-DT-RELSZ |
| # RUN: llvm-readelf --dyn-relocations %t4 2>&1 | FileCheck %s -DFILE=%t4 --check-prefix=INVALID-DT-RELSZ |
| |
| ## INVALID-DT-RELSZ: warning: '[[FILE]]': invalid DT_RELSZ value (0xff) or DT_RELENT value (0x18) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_REL |
| Relocations: |
| - Type: R_386_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_REL |
| Value: 0x0 |
| - Tag: DT_RELSZ |
| Value: 0xFF |
| - Tag: DT_RELENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELENT entry. |
| # RUN: yaml2obj --docnum=5 %s -o %t5 |
| # RUN: llvm-readobj --dyn-relocations %t5 2>&1 | FileCheck %s -DFILE=%t5 --check-prefix=INVALID-DT-RELENT |
| # RUN: llvm-readelf --dyn-relocations %t5 2>&1 | FileCheck %s -DFILE=%t5 --check-prefix=INVALID-DT-RELENT |
| |
| ## INVALID-DT-RELENT: warning: '[[FILE]]': invalid DT_RELSZ value (0x18) or DT_RELENT value (0xff) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_REL |
| Relocations: |
| - Type: R_386_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_REL |
| Value: 0x0 |
| - Tag: DT_RELSZ |
| Value: 0x18 |
| - Tag: DT_RELENT |
| Value: 0xFF |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table size stored in a DT_RELRSZ/DT_ANDROID_RELRSZ entry. |
| # RUN: yaml2obj --docnum=6 %s -o %t6 |
| # RUN: llvm-readobj --dyn-relocations %t6 2>&1 | FileCheck %s -DFILE=%t6 --check-prefix=INVALID-DT-RELRSZ |
| # RUN: llvm-readelf --dyn-relocations %t6 2>&1 | FileCheck %s -DFILE=%t6 --check-prefix=INVALID-DT-RELRSZ |
| # RUN: yaml2obj --docnum=7 %s -o %t7 |
| # RUN: llvm-readobj --dyn-relocations %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DT-ANDROID-RELRSZ |
| # RUN: llvm-readelf --dyn-relocations %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DT-ANDROID-RELRSZ |
| |
| ## INVALID-DT-RELRSZ: warning: '[[FILE]]': invalid DT_RELRSZ value (0xff) or DT_RELRENT value (0x18) |
| ## INVALID-DT-ANDROID-RELRSZ: warning: '[[FILE]]': invalid DT_ANDROID_RELRSZ value (0xff) or DT_ANDROID_RELRENT value (0x18) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .relr.dyn |
| Type: SHT_RELR |
| Flags: [ SHF_ALLOC ] |
| Content: "" |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELR |
| Value: 0x0 |
| - Tag: DT_RELRSZ |
| Value: 0xFF |
| - Tag: DT_RELRENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .relr.dyn |
| - Section: .dynamic |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .relr.dyn |
| Type: SHT_RELR |
| Flags: [ SHF_ALLOC ] |
| Content: "" |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELR |
| Value: 0x0 |
| - Tag: DT_ANDROID_RELRSZ |
| Value: 0xFF |
| - Tag: DT_ANDROID_RELRENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .relr.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid relocation table entry size stored in a DT_RELRENT/DT_ANDROID_RELRENT entry. |
| # RUN: yaml2obj --docnum=8 %s -o %t8 |
| # RUN: llvm-readobj --dyn-relocations %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=INVALID-DT-RELRENT |
| # RUN: llvm-readelf --dyn-relocations %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=INVALID-DT-RELRENT |
| # RUN: yaml2obj --docnum=9 %s -o %t9 |
| # RUN: llvm-readobj --dyn-relocations %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=INVALID-DT-ANDROID-RELRENT |
| # RUN: llvm-readelf --dyn-relocations %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=INVALID-DT-ANDROID-RELRENT |
| |
| ## INVALID-DT-RELRENT: invalid DT_RELRSZ value (0x18) or DT_RELRENT value (0xff) |
| ## INVALID-DT-ANDROID-RELRENT: invalid DT_ANDROID_RELRSZ value (0x18) or DT_ANDROID_RELRENT value (0xff) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .relr.dyn |
| Type: SHT_RELR |
| Flags: [ SHF_ALLOC ] |
| Content: "" |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELR |
| Value: 0x0 |
| - Tag: DT_RELRSZ |
| Value: 0x18 |
| - Tag: DT_RELRENT |
| Value: 0xFF |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .relr.dyn |
| - Section: .dynamic |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .relr.dyn |
| Type: SHT_RELR |
| Flags: [ SHF_ALLOC ] |
| Content: "" |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELR |
| Value: 0x0 |
| - Tag: DT_ANDROID_RELRSZ |
| Value: 0x18 |
| - Tag: DT_ANDROID_RELRENT |
| Value: 0xFF |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .relr.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning for an invalid value of DT_PLTRELSZ, which describes the total size |
| ## of the relocation entries associated with the procedure linkage table. |
| # RUN: yaml2obj --docnum=10 %s -o %t10 |
| # RUN: llvm-readobj --dyn-relocations %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=INVALID-DT-PLTRELSZ |
| # RUN: llvm-readelf --dyn-relocations %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=INVALID-DT-PLTRELSZ |
| |
| # INVALID-DT-PLTRELSZ: warning: '[[FILE]]': invalid DT_PLTRELSZ value (0xff){{$}} |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.plt |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_JMPREL |
| Value: 0x0 |
| - Tag: DT_PLTRELSZ |
| Value: 0xFF ## The valid value would be 0x18. |
| - Tag: DT_PLTREL |
| Value: 0x7 ## DT_RELA |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.plt |
| - Section: .dynamic |
| |
| ## Show we print a warning when dumping dynamic relocations if there is no dynamic symbol table. |
| # RUN: yaml2obj --docnum=11 %s -o %t11 |
| # RUN: llvm-readobj --dyn-relocations %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=LLVM-NO-DYNSYM |
| # RUN: llvm-readelf --dyn-relocations %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=GNU-NO-DYNSYM |
| |
| # LLVM-NO-DYNSYM: Dynamic Relocations { |
| # LLVM-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 0: no dynamic symbol table found |
| # LLVM-NO-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0 |
| # LLVM-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: no dynamic symbol table found |
| # LLVM-NO-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0 |
| # LLVM-NO-DYNSYM-NEXT: } |
| |
| # GNU-NO-DYNSYM: 'RELA' relocation section at offset 0x78 contains 48 bytes: |
| # GNU-NO-DYNSYM-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| # GNU-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 0: no dynamic symbol table found |
| # GNU-NO-DYNSYM-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE <corrupt> + 0 |
| # GNU-NO-DYNSYM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: no dynamic symbol table found |
| # GNU-NO-DYNSYM-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE <corrupt> + 0 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| - Type: R_X86_64_NONE |
| Symbol: 0x1 |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0 |
| - Tag: DT_RELASZ |
| Value: 0x30 |
| - Tag: DT_RELAENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show we print a warning when the symbol index of a dynamic relocation is too |
| ## large (goes past the end of the dynamic symbol table). |
| # RUN: yaml2obj --docnum=12 %s -o %t12 |
| # RUN: llvm-readobj --dyn-relocations %t12 2>&1 | FileCheck %s -DFILE=%t12 --check-prefix=LLVM-INVALID-DYNSYM |
| # RUN: llvm-readelf --dyn-relocations %t12 2>&1 | FileCheck %s -DFILE=%t12 --check-prefix=GNU-INVALID-DYNSYM |
| |
| # LLVM-INVALID-DYNSYM: Dynamic Relocations { |
| # 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) |
| # LLVM-INVALID-DYNSYM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0 |
| # LLVM-INVALID-DYNSYM-NEXT: } |
| |
| # GNU-INVALID-DYNSYM: 'RELA' relocation section at offset 0x78 contains 24 bytes: |
| # GNU-INVALID-DYNSYM-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| # 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) |
| # GNU-INVALID-DYNSYM-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE <corrupt> + 0 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| Symbol: 0x2 |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0 |
| - Tag: DT_RELASZ |
| Value: 0x18 |
| - Tag: DT_RELAENT |
| Value: 0x18 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: |
| - Name: foo |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .dynamic |
| |
| ## Show that when we have both REL and RELA relocations, we dump both sets. |
| # RUN: yaml2obj --docnum=13 %s -o %t13 |
| # RUN: llvm-readobj --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-LLVM |
| # RUN: llvm-readelf --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-GNU |
| |
| # BOTH-RELA-REL-LLVM: Dynamic Relocations { |
| # BOTH-RELA-REL-LLVM-NEXT: 0x1 R_X86_64_NONE - 0x0 |
| # BOTH-RELA-REL-LLVM-NEXT: 0x2 R_X86_64_NONE - 0x0 |
| # BOTH-RELA-REL-LLVM-NEXT: } |
| |
| # BOTH-RELA-REL-GNU: 'RELA' relocation section at offset 0x78 contains 24 bytes: |
| # BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| # BOTH-RELA-REL-GNU-NEXT: 0000000000000001 0000000000000000 R_X86_64_NONE 0 |
| # BOTH-RELA-REL-GNU-EMPTY: |
| # BOTH-RELA-REL-GNU: 'REL' relocation section at offset 0x90 contains 16 bytes: |
| # BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name |
| # BOTH-RELA-REL-GNU-NEXT: 0000000000000002 0000000000000000 R_X86_64_NONE |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .rela.dyn |
| Type: SHT_RELA |
| Relocations: |
| - Type: R_X86_64_NONE |
| Offset: 0x1 |
| - Name: .rel.dyn |
| Type: SHT_REL |
| Relocations: |
| - Type: R_X86_64_NONE |
| Offset: 0x2 |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Entries: |
| - Tag: DT_RELA |
| Value: 0x0 |
| - Tag: DT_RELASZ |
| Value: 0x18 |
| - Tag: DT_RELAENT |
| Value: 0x18 |
| ## 0x18 == offset of .rel.dyn == size of .rela.dyn section. |
| - Tag: DT_REL |
| Value: 0x18 |
| - Tag: DT_RELSZ |
| Value: 0x10 |
| - Tag: DT_RELENT |
| Value: 0x10 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Sections: |
| - Section: .rela.dyn |
| - Section: .rel.dyn |
| - Section: .dynamic |