Support arm32 R_ARM_V4BX relocation format

ARM32 ELF R_ARM_V4BX relocation format is a special relocation type
that records the location of an ARMv4t BX instruction to enable a
static linker to generate ARMv4 compatible instructions.  This
relocation does not contain a reference symbol.

This patch enabled its creation by removing the requeriment of a
relocation symbol target in ELFState<ELFT>::writeSectionContent.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235513 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Adhemerval Zanella 2015-04-22 15:26:43 +00:00
parent 8b94db17a4
commit c728e851dc
2 changed files with 82 additions and 6 deletions

View File

@ -0,0 +1,77 @@
# RUN: yaml2obj -format=elf %s | llvm-readobj -sections -relocations - | FileCheck %s
!ELF
FileHeader: !FielHeader
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_ARM
Flags: [ EF_ARM_EABI_VER5 ]
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000004
Content: 03308FE0022093E7000052E31EFF2F01
- Name: .rel.text
Type: SHT_REL
Flags: [ SHF_INFO_LINK ]
Link: .symtab
AddressAlign: 0x0000000000000004
Info: .text
Relocations:
- Offset: 0x000000000000000C
Symbol: ''
Type: R_ARM_V4BX
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
AddressAlign: 0x0000000000000001
Content: ''
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
AddressAlign: 0x0000000000000001
Content: ''
- Name: .ARM.attributes
Type: SHT_ARM_ATTRIBUTES
AddressAlign: 0x0000000000000001
Content: 4115000000616561626900010B000000060208010901
Symbols:
Local:
- Name: .text
Type: STT_SECTION
Section: .text
- Name: .data
Type: STT_SECTION
Section: .data
- Name: .bss
Type: STT_SECTION
Section: .bss
- Name: '$a'
Section: .text
- Name: call_weak_fn
Type: STT_FUNC
Section: .text
- Name: .ARM.attributes
Type: STT_SECTION
Section: .ARM.attributes
# CHECK: Section {
# CHECK-NEXT: Index: 0
# CHECK: }
# CHECK: Section {
# CHECK-NEXT: Index: 1
# CHECK-NEXT: Name: .text (5)
# CHECK: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 2
# CHECK-NEXT: Name: .rel.text (1)
# CHECK-NEXT: Type: SHT_REL (0x9)
# CHECK-NEXT: Flags [ (0x40)
# CHECK: }
# CHECK: Relocations [
# CHECK-NEXT: Section (2) .rel.text {
# CHECK-NEXT: 0xC R_ARM_V4BX - 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]

View File

@ -357,12 +357,11 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset);
for (const auto &Rel : Section.Relocations) {
unsigned SymIdx;
if (SymN2I.lookup(Rel.Symbol, SymIdx)) {
errs() << "error: Unknown symbol referenced: '" << Rel.Symbol
<< "' at YAML relocation.\n";
return false;
}
unsigned SymIdx = 0;
// Some special relocation, R_ARM_v4BX for instance, does not have
// an external reference. So it ignores the return value of lookup()
// here.
SymN2I.lookup(Rel.Symbol, SymIdx);
if (IsRela) {
Elf_Rela REntry;