llvm-objcopy may modify the symbol table and need to rewrite relocations. For CREL, while we can reuse the decoder from #91280, we need an encoder to support CREL. Since MC/ELFObjectWriter.cpp has an existing encoder, and MC is at a lower layer than Object, extract the encoder to a new header file llvm/MC/MCELFExtras.h. Link: https://discourse.llvm.org/t/rfc-crel-a-compact-relocation-format-for-elf/77600 Pull Request: https://github.com/llvm/llvm-project/pull/97521
141 lines
4.0 KiB
Plaintext
141 lines
4.0 KiB
Plaintext
# RUN: yaml2obj %s -o %t
|
|
# RUN: llvm-objcopy --remove-section=.foo --strip-symbol=unused %t %t.out
|
|
# RUN: llvm-readelf -Sr %t.out | FileCheck %s
|
|
|
|
# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
|
|
# CHECK-NEXT: [ 1] .text PROGBITS 0000000000000000 {{.*}} 000008 00 A 0 0 0
|
|
# CHECK-NEXT: [ 2] .crel.text CREL 0000000000000000 {{.*}} 000022 00 5 1 0
|
|
# CHECK-NEXT: [ 3] nonalloc PROGBITS 0000000000000000 {{.*}} 000030 00 0 0 0
|
|
# CHECK-NEXT: [ 4] .crelnonalloc CREL 0000000000000000 {{.*}} 00000b 00 5 3 0
|
|
|
|
# CHECK: Relocation section '.crel.text' at offset {{.*}} contains 4 entries:
|
|
# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
|
|
# CHECK-NEXT: 0000000000000001 {{.*}} R_X86_64_32 0000000000000000 g1 + 1
|
|
# CHECK-NEXT: 0000000000000002 {{.*}} R_X86_64_64 0000000000000000 l1 + 2
|
|
# CHECK-NEXT: 0000000000000000 {{.*}} R_X86_64_32S 0000000000000000 g1 - 1
|
|
# CHECK-NEXT: 0000000000000004 {{.*}} R_X86_64_32S 0000000000000000 .text - 8000000000000000
|
|
# CHECK-EMPTY:
|
|
# CHECK-NEXT: Relocation section '.crelnonalloc' at offset {{.*}} contains 3 entries:
|
|
# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
|
|
# CHECK-NEXT: 0000000000000010 {{.*}} R_X86_64_64 0000000000000000 g1 + 1
|
|
# CHECK-NEXT: 0000000000000020 {{.*}} R_X86_64_64 0000000000000000 g2 + 2
|
|
# CHECK-NEXT: 0000000000000030 {{.*}} R_X86_64_64 0
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
|
|
Sections:
|
|
- Name: .foo
|
|
Type: SHT_PROGBITS
|
|
Flags: [SHF_ALLOC]
|
|
- 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: unused
|
|
Section: .text
|
|
- 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
|
|
|
|
# RUN: yaml2obj --docnum=2 %s -o %t.32
|
|
# RUN: llvm-objcopy %t.32 %t.32.out
|
|
# RUN: llvm-readobj -r %t.32.out | FileCheck %s --check-prefix=CHECK2
|
|
|
|
# CHECK2: Relocations [
|
|
# CHECK2-NEXT: Section (2) .crel.text {
|
|
# CHECK2-NEXT: 0x0 R_X86_64_32S g1 0xFFFFFFFF
|
|
# CHECK2-NEXT: 0x4 R_X86_64_32S .text 0x80000000
|
|
# CHECK2-NEXT: }
|
|
# CHECK2-NEXT: ]
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
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: 0x0
|
|
Symbol: g1
|
|
Type: R_X86_64_32S
|
|
Addend: 0xffffffff
|
|
- Offset: 0x4
|
|
Symbol: .text
|
|
Type: R_X86_64_32S
|
|
Addend: 0x80000000
|
|
|
|
Symbols:
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|
|
- Name: g1
|
|
Section: .text
|
|
Size: 4
|
|
Binding: STB_GLOBAL
|