summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-09-22 17:49:38 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-09-22 17:49:38 +0000
commit50534c2b6f03f8e108e2815394528b58c29e821a (patch)
treefc0acbd9235bb2ba66313e72ff320f0e98f016d1
parent77011ba16a942df5aad542ce337b376cfda66e32 (diff)
downloadbcm5719-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.cpp10
-rw-r--r--lld/test/elf2/shared.s30
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
OpenPOWER on IntegriCloud