CREL is a compact relocation format for the ELF object file format. This patch adds integrated assembler support (using the RELA form) available with `llvm-mc -filetype=obj -crel a.s -o a.o`. A dependent patch will add `clang -c -Wa,--crel,--allow-experimental-crel`. Also add llvm-readobj support (for both REL and RELA forms) to facilitate testing the assembler. Additionally, yaml2obj gains support for the RELA form to aid testing with llvm-readobj. We temporarily assign the section type code 0x40000020 from the generic range to `SHT_CREL`. We avoided using `SHT_LLVM_` or `SHT_GNU_` to avoid code churn and maintain broader applicability for interested psABIs. Similarly, `DT_CREL` is temporarily 0x40000026. LLVM will change the code and break compatibility. This is not an issue if all relocatable files using CREL are regenerated (aka no prebuilt relocatable files). Link: https://discourse.llvm.org/t/rfc-crel-a-compact-relocation-format-for-elf/77600 Pull Request: https://github.com/llvm/llvm-project/pull/91280
231 lines
7.4 KiB
Plaintext
231 lines
7.4 KiB
Plaintext
# RUN: yaml2obj --docnum=1 %s -o %t
|
|
# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=LLVM --match-full-lines
|
|
# RUN: llvm-readelf -r %t | FileCheck %s --check-prefix=GNU --match-full-lines
|
|
|
|
# LLVM: Relocations [
|
|
# LLVM-NEXT: Section ([[#]]) .crel.text {
|
|
# LLVM-NEXT: 0x1 R_X86_64_32 g1 0x1
|
|
# LLVM-NEXT: 0x2 R_X86_64_64 l1 0x2
|
|
# LLVM-NEXT: 0x0 R_X86_64_32S g1 0xFFFFFFFFFFFFFFFF
|
|
# LLVM-NEXT: 0x4 R_X86_64_32S .text 0x8000000000000000
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: Section ([[#]]) .crelnonalloc {
|
|
# LLVM-NEXT: 0x10 R_X86_64_64 g1 0x1
|
|
# LLVM-NEXT: 0x20 R_X86_64_64 g2 0x2
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: ]
|
|
|
|
# GNU: Relocation section '.crel.text' at offset 0x48 contains 4 entries:
|
|
# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
|
|
# GNU-NEXT: 0000000000000001 000000030000000a R_X86_64_32 0000000000000000 g1 + 1
|
|
# GNU-NEXT: 0000000000000002 0000000200000001 R_X86_64_64 0000000000000000 l1 + 2
|
|
# GNU-NEXT: 0000000000000000 000000030000000b R_X86_64_32S 0000000000000000 g1 - 1
|
|
# GNU-NEXT: 0000000000000004 000000010000000b R_X86_64_32S 0000000000000000 .text - 8000000000000000
|
|
# GNU-EMPTY:
|
|
# GNU-NEXT: Relocation section '.crelnonalloc' at offset 0xa2 contains 2 entries:
|
|
# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
|
|
# GNU-NEXT: 0000000000000010 0000000300000001 R_X86_64_64 0000000000000000 g1 + 1
|
|
# GNU-NEXT: 0000000000000020 0000000400000001 R_X86_64_64 0000000000000000 g2 + 2
|
|
|
|
--- !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
|
|
|
|
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 -o %t2
|
|
# RUN: llvm-readobj -r %t2 | FileCheck %s --check-prefix=LLVM2 --match-full-lines
|
|
# RUN: llvm-readelf -r %t2 | FileCheck %s --check-prefix=GNU2 --match-full-lines
|
|
|
|
# LLVM2: Relocations [
|
|
# LLVM2-NEXT: Section (2) .crel.text {
|
|
# LLVM2-NEXT: 0x8 R_386_PC32 l1 0x1
|
|
# LLVM2-NEXT: 0x4 R_386_32 g1 0x0
|
|
# LLVM2-NEXT: }
|
|
# LLVM2-NEXT: ]
|
|
|
|
# GNU2: Relocation section '.crel.text' at offset {{.*}} contains 2 entries:
|
|
# GNU2-NEXT: Offset Info Type Sym. Value Symbol's Name + Addend
|
|
# GNU2-NEXT: 00000008 00000102 R_386_PC32 00000000 l1 + 1
|
|
# GNU2-NEXT: 00000004 00000201 R_386_32 00000000 g1 + 0
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_386
|
|
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_386_PC32
|
|
Addend: 1
|
|
- Offset: 0x4
|
|
Symbol: g1
|
|
Type: R_386_32
|
|
Symbols:
|
|
- Name: l1
|
|
- Name: g1
|
|
Binding: STB_GLOBAL
|
|
|
|
## Check CREL with implicit addends.
|
|
# RUN: yaml2obj --docnum=3 %s -o %t3
|
|
# RUN: llvm-readobj -r %t3 | FileCheck %s --check-prefix=LLVM3 --match-full-lines
|
|
# RUN: llvm-readelf -r %t3 | FileCheck %s --check-prefix=GNU3 --match-full-lines
|
|
|
|
# LLVM3: Relocations [
|
|
# LLVM3-NEXT: Section (3) .crel.data {
|
|
# LLVM3-NEXT: 0x1F R_X86_64_32 g1
|
|
# LLVM3-NEXT: 0x3F R_X86_64_64 g1
|
|
# LLVM3-NEXT: 0x0 R_X86_64_32S l1
|
|
# LLVM3-NEXT: }
|
|
# LLVM3-NEXT: ]
|
|
|
|
# GNU3: Relocation section '.crel.data' at offset {{.*}} contains 3 entries:
|
|
# GNU3-NEXT: Offset Info Type Symbol's Value Symbol's Name
|
|
# GNU3-NEXT: 000000000000001f 000000030000000a R_X86_64_32 0000000000000000 g1
|
|
# GNU3-NEXT: 000000000000003f 0000000300000001 R_X86_64_64 0000000000000000 g1
|
|
# GNU3-NEXT: 0000000000000000 000000020000000b R_X86_64_32S 0000000000000000 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. See also relocation-errors.test.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t.err
|
|
# RUN: llvm-readobj -r %t.err 2>&1 | FileCheck %s --check-prefix=ERR-LLVM -DFILE=%t.err
|
|
# RUN: llvm-readelf -r %t.err 2>&1 | FileCheck %s --check-prefix=ERR-GNU -DFILE=%t.err
|
|
|
|
# ERR-LLVM: Section ([[#]]) .crel.data {
|
|
# ERR-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_CREL section with index 3: unable to decode LEB128 at offset 0x00000000: malformed uleb128, extends past end
|
|
# ERR-LLVM-NEXT: }
|
|
|
|
# ERR-GNU: warning: '[[FILE]]': unable to get the number of relocations in SHT_CREL section with index 3: unable to decode LEB128 at offset 0x00000000: malformed uleb128, extends past end
|
|
# ERR-GNU-EMPTY:
|
|
# ERR-GNU-NEXT: Relocation section '.crel.data' at offset 0x40 contains <?> entries:
|
|
# ERR-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
|
|
# ERR-GNU-NOT: {{.}}
|
|
|
|
# RUN: yaml2obj --docnum=4 -DCONTENT=08 %s -o %t.err2
|
|
# RUN: llvm-readobj -r %t.err2 2>&1 | FileCheck %s --check-prefix=ERR2-LLVM -DFILE=%t.err2
|
|
# RUN: llvm-readelf -r %t.err2 2>&1 | FileCheck %s --check-prefix=ERR2-GNU -DFILE=%t.err2
|
|
|
|
# ERR2-LLVM: Section ([[#]]) .crel.data {
|
|
# ERR2-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_CREL section with index 3: unexpected end of data at offset 0x1 while reading [0x1, 0x2)
|
|
# ERR2-LLVM-NEXT: }
|
|
|
|
# ERR2-GNU: Relocation section '.crel.data' at offset 0x40 contains 1 entries:
|
|
# ERR2-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
|
|
# ERR2-GNU: warning: '[[FILE]]': unable to read relocations from SHT_CREL section with index 3: unexpected end of data at offset 0x1 while reading [0x1, 0x2)
|
|
# ERR2-GNU-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
|
|
Content: [[CONTENT=""]]
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|