diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-22 17:49:38 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-22 17:49:38 +0000 |
| commit | 50534c2b6f03f8e108e2815394528b58c29e821a (patch) | |
| tree | fc0acbd9235bb2ba66313e72ff320f0e98f016d1 | |
| parent | 77011ba16a942df5aad542ce337b376cfda66e32 (diff) | |
| download | bcm5719-llvm-50534c2b6f03f8e108e2815394528b58c29e821a.tar.gz bcm5719-llvm-50534c2b6f03f8e108e2815394528b58c29e821a.zip | |
Fix the creation of Elf_Rel sections.
We were always incrementing the output buffer pointer by sizeof(Elf_Rela).
llvm-svn: 248303
| -rw-r--r-- | lld/ELF/OutputSections.cpp | 10 | ||||
| -rw-r--r-- | lld/test/elf2/shared.s | 30 |
2 files changed, 31 insertions, 9 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 4fc87ded169..4640d987d66 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -92,9 +92,12 @@ bool lld::elf2::relocNeedsGOT(uint32_t Type) { } template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) { - auto *P = reinterpret_cast<Elf_Rela *>(Buf); + const unsigned EntrySize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel); bool IsMips64EL = Relocs[0].C.getFile()->getObj()->isMips64EL(); for (const DynamicReloc<ELFT> &Rel : Relocs) { + auto *P = reinterpret_cast<Elf_Rel *>(Buf); + Buf += EntrySize; + const InputSection<ELFT> &C = Rel.C; const Elf_Rel &RI = Rel.RI; OutputSection<ELFT> *Out = C.getOutputSection(); @@ -109,10 +112,9 @@ template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) { P->r_offset = RI.r_offset + C.getOutputSectionOff() + Out->getVA(); P->setSymbolAndType(Body->getDynamicSymbolTableIndex(), Type, IsMips64EL); if (IsRela) - P->r_addend = static_cast<const Elf_Rela &>(RI).r_addend; + static_cast<Elf_Rela *>(P)->r_addend = + static_cast<const Elf_Rela &>(RI).r_addend; } - - ++P; } } diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s index 523052c95d6..a94fb8d77c5 100644 --- a/lld/test/elf2/shared.s +++ b/lld/test/elf2/shared.s @@ -45,7 +45,7 @@ // CHECK-NEXT: ] // CHECK-NEXT: Address: [[DYNSYMADDR:.*]] // CHECK-NEXT: Offset: 0x201C -// CHECK-NEXT: Size: 48 +// CHECK-NEXT: Size: // CHECK-NEXT: Link: [[DYNSTR:.*]] // CHECK-NEXT: Info: 1 // CHECK-NEXT: AddressAlignment: 4 @@ -54,6 +54,7 @@ // CHECK-NEXT: 0000: // CHECK-NEXT: 0010: // CHECK-NEXT: 0020: +// CHECK-NEXT: 0030: // CHECK-NEXT: ) // CHECK-NEXT: } // CHECK-NEXT: Section { @@ -144,6 +145,15 @@ // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: zed (62) +// CHECK-NEXT: Value: 0x0 +// CHECK-NEXT: Size: 0 +// CHECK-NEXT: Binding: Global (0x1) +// CHECK-NEXT: Type: None (0x0) +// CHECK-NEXT: Other: 0 +// CHECK-NEXT: Section: Undefined (0x0) +// CHECK-NEXT: } // CHECK-NEXT: ] // CHECK: DynamicSymbols [ @@ -174,6 +184,15 @@ // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: zed@ +// CHECK-NEXT: Value: 0x0 +// CHECK-NEXT: Size: 0 +// CHECK-NEXT: Binding: Global +// CHECK-NEXT: Type: None +// CHECK-NEXT: Other: 0 +// CHECK-NEXT: Section: Undefined +// CHECK-NEXT: } // CHECK-NEXT: ] // CHECK: DynamicSection [ @@ -216,12 +235,13 @@ // CHECK-NEXT: } // CHECK: HashTable { -// CHECK-NEXT: Num Buckets: 3 -// CHECK-NEXT: Num Chains: 3 -// CHECK-NEXT: Buckets: [2, 0, 1] -// CHECK-NEXT: Chains: [0, 0, 0] +// CHECK-NEXT: Num Buckets: 4 +// CHECK-NEXT: Num Chains: 4 +// CHECK-NEXT: Buckets: [3, 0, 2, 0] +// CHECK-NEXT: Chains: [0, 0, 0, 1] // CHECK-NEXT: } .global _start _start: .long bar +.long zed |

