Extract the llvm-readelf decoder to `decodeCrel` (#91280) and reuse it for llvm-objdump. Because the section representation of LLVMObject (`SectionRef`) is 64-bit, insufficient to hold all decoder states, `section_rel_begin` is modified to decode CREL eagerly and hold the decoded relocations inside ELFObjectFile<ELFT>. The test is adapted from llvm/test/tools/llvm-readobj/ELF/crel.test. Pull Request: https://github.com/llvm/llvm-project/pull/97382
214 lines
5.3 KiB
Plaintext
214 lines
5.3 KiB
Plaintext
# RUN: yaml2obj --docnum=1 %s -o %t
|
|
# RUN: llvm-objdump -r %t | FileCheck %s --strict-whitespace --match-full-lines
|
|
|
|
# CHECK:RELOCATION RECORDS FOR [.text]:
|
|
# CHECK-NEXT:OFFSET TYPE VALUE
|
|
# CHECK-NEXT:0000000000000001 R_X86_64_32 g1+0x1
|
|
# CHECK-NEXT:0000000000000002 R_X86_64_64 l1+0x2
|
|
# CHECK-NEXT:0000000000000000 R_X86_64_32S g1-0x1
|
|
# CHECK-NEXT:0000000000000004 R_X86_64_32S .text-0x8000000000000000
|
|
#CHECK-EMPTY:
|
|
# CHECK-NEXT:RELOCATION RECORDS FOR [nonalloc]:
|
|
# CHECK-NEXT:OFFSET TYPE VALUE
|
|
# CHECK-NEXT:0000000000000010 R_X86_64_64 g1+0x1
|
|
# CHECK-NEXT:0000000000000020 R_X86_64_64 g2+0x2
|
|
# CHECK-NEXT:0000000000000030 R_X86_64_64 *ABS*
|
|
# CHECK-NOT:{{.}}
|
|
|
|
--- !ELF
|
|
FileHeader: !FileHeader
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Content: "0000000000000000"
|
|
Flags: [SHF_ALLOC]
|
|
- Name: .crel.text
|
|
Type: SHT_CREL
|
|
Info: .text
|
|
Link: .symtab
|
|
Relocations:
|
|
- Offset: 0x1
|
|
Symbol: g1
|
|
Type: R_X86_64_32
|
|
Addend: 1
|
|
- Offset: 0x2
|
|
Symbol: l1
|
|
Type: R_X86_64_64
|
|
Addend: 2
|
|
- Offset: 0x0
|
|
Symbol: g1
|
|
Type: R_X86_64_32S
|
|
Addend: 0xffffffffffffffff
|
|
- Offset: 0x4
|
|
Symbol: .text
|
|
Type: R_X86_64_32S
|
|
Addend: 0x8000000000000000
|
|
- Name: nonalloc
|
|
Type: SHT_PROGBITS
|
|
Size: 0x30
|
|
- Name: .crelnonalloc
|
|
Type: SHT_CREL
|
|
Info: nonalloc
|
|
Link: .symtab
|
|
Relocations:
|
|
- Offset: 0x10
|
|
Symbol: g1
|
|
Type: R_X86_64_64
|
|
Addend: 1
|
|
- Offset: 0x20
|
|
Symbol: g2
|
|
Type: R_X86_64_64
|
|
Addend: 2
|
|
- Offset: 0x30
|
|
Symbol: 0
|
|
Type: R_X86_64_64
|
|
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|
|
- Name: l1
|
|
- Name: g1
|
|
Section: .text
|
|
Value: 0x0
|
|
Size: 4
|
|
Binding: STB_GLOBAL
|
|
- Name: g2
|
|
Binding: STB_GLOBAL
|
|
|
|
## Check relocation formatting on ELFCLASS32 as well.
|
|
# RUN: yaml2obj --docnum=2 %s > %t2
|
|
# RUN: llvm-objdump -r %t2 | FileCheck %s --check-prefix=ELF32 --strict-whitespace --match-full-lines
|
|
|
|
# ELF32:RELOCATION RECORDS FOR [.text]:
|
|
# ELF32-NEXT:OFFSET TYPE VALUE
|
|
# ELF32-NEXT:00000008 R_ARM_REL32 l1+0x1
|
|
# ELF32-NEXT:00000004 R_ARM_ABS32 g1
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2MSB
|
|
Type: ET_REL
|
|
Machine: EM_ARM
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Size: 0x10
|
|
- Name: .crel.text
|
|
Type: SHT_CREL
|
|
Info: .text
|
|
Link: .symtab
|
|
Relocations:
|
|
- Offset: 0x8
|
|
Symbol: l1
|
|
Type: R_ARM_REL32
|
|
Addend: 1
|
|
- Offset: 0x4
|
|
Symbol: g1
|
|
Type: R_ARM_ABS32
|
|
Symbols:
|
|
- Name: l1
|
|
- Name: g1
|
|
Binding: STB_GLOBAL
|
|
|
|
## Check CREL with implicit addends.
|
|
# RUN: yaml2obj --docnum=3 %s -o %t3
|
|
# RUN: llvm-objdump -r %t3 | FileCheck %s --check-prefix=IMPLICIT --strict-whitespace --match-full-lines
|
|
# IMPLICIT:RELOCATION RECORDS FOR [.data]:
|
|
# IMPLICIT-NEXT:OFFSET TYPE VALUE
|
|
# IMPLICIT-NEXT:000000000000001f R_X86_64_32 g1
|
|
# IMPLICIT-NEXT:000000000000003f R_X86_64_64 g1
|
|
# IMPLICIT-NEXT:0000000000000000 R_X86_64_32S l1
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
- Name: .data
|
|
Type: SHT_PROGBITS
|
|
- Name: .crel.data
|
|
Type: SHT_CREL
|
|
Flags: [ SHF_INFO_LINK ]
|
|
Link: .symtab
|
|
Info: .data
|
|
Content: 187f030a82017787feffffffffffffff077f0a
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|
|
- Name: l1
|
|
Section: .text
|
|
- Name: g1
|
|
Section: .text
|
|
Binding: STB_GLOBAL
|
|
|
|
## Test errors.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t.err
|
|
# RUN: llvm-objdump -r %t.err 2>&1 | FileCheck %s --check-prefix=ERR -DFILE=%t.err
|
|
|
|
# ERR:RELOCATION RECORDS FOR [.data]:
|
|
# ERR-NEXT:OFFSET TYPE VALUE
|
|
# ERR-NEXT:warning: '[[FILE]]': unable to decode LEB128 at offset 0x00000000: malformed uleb128, extends past end
|
|
# ERR-NOT:{{.}}
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
- Name: .data
|
|
Type: SHT_PROGBITS
|
|
- Name: .crel.data
|
|
Type: SHT_CREL
|
|
Flags: []
|
|
Link: .symtab
|
|
Info: .data
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|
|
|
|
# RUN: yaml2obj --docnum=5 %s -o %t.err2
|
|
# RUN: llvm-objdump -r %t.err2 2>&1 | FileCheck %s --check-prefix=ERR2 -DFILE=%t.err2
|
|
|
|
# ERR2:RELOCATION RECORDS FOR [.data]:
|
|
# ERR2-NEXT:OFFSET TYPE VALUE
|
|
# ERR2-NEXT:warning: '[[FILE]]': unexpected end of data at offset 0x1 while reading [0x1, 0x2)
|
|
# ERR2-NOT:{{.}}
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2MSB
|
|
Type: ET_REL
|
|
Machine: EM_ARM
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
- Name: .data
|
|
Type: SHT_PROGBITS
|
|
- Name: .crel.data
|
|
Type: SHT_CREL
|
|
Flags: []
|
|
Link: .symtab
|
|
Info: .data
|
|
Content: 08
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|