summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-02-23 18:39:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-02-23 18:39:55 +0000
commit75baf09be5a4e9d8223fa18e1d28f130ba5460de (patch)
tree3389d76f061be26d921d97d9177d672ee3965efb
parent62b7f7a398a46e7c6cbe6709fab3c5b04de653a3 (diff)
downloadbcm5719-llvm-75baf09be5a4e9d8223fa18e1d28f130ba5460de.tar.gz
bcm5719-llvm-75baf09be5a4e9d8223fa18e1d28f130ba5460de.zip
Don't include tbss's alignment in offset.
The .tbss section is in the middle of a PT_LOAD. Whatever treatment we give to its address we must also give to the offset. We were ignoring it for address computations, but not for offset. Fixes pr26712. llvm-svn: 261667
-rw-r--r--lld/ELF/Writer.cpp3
-rw-r--r--lld/test/ELF/relocation-copy-i686.s2
-rw-r--r--lld/test/ELF/relocation-copy.s2
-rw-r--r--lld/test/ELF/symbols.s2
-rw-r--r--lld/test/ELF/tls-offset.s56
5 files changed, 61 insertions, 4 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 525bb30d47a..52741b1cf46 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -1344,7 +1344,8 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
if (PageAlign.count(Sec))
Align = std::max<uintX_t>(Align, Target->PageSize);
- FileOff = alignTo(FileOff, Align);
+ if (Sec->getType() != SHT_NOBITS)
+ FileOff = alignTo(FileOff, Align);
Sec->setFileOffset(FileOff);
if (Sec->getType() != SHT_NOBITS)
FileOff += Sec->getSize();
diff --git a/lld/test/ELF/relocation-copy-i686.s b/lld/test/ELF/relocation-copy-i686.s
index d61f84783cb..f9ee32e2b35 100644
--- a/lld/test/ELF/relocation-copy-i686.s
+++ b/lld/test/ELF/relocation-copy-i686.s
@@ -22,7 +22,7 @@ movl $9, z
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x13000
-// CHECK-NEXT: Offset: 0x3000
+// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 24
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
diff --git a/lld/test/ELF/relocation-copy.s b/lld/test/ELF/relocation-copy.s
index 2e958ad5e95..9d13241f549 100644
--- a/lld/test/ELF/relocation-copy.s
+++ b/lld/test/ELF/relocation-copy.s
@@ -23,7 +23,7 @@ movl $z, %edx
// CHECK-NEXT: SHF_WRITE (0x1)
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x13000
-// CHECK-NEXT: Offset: 0x3000
+// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 24
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
diff --git a/lld/test/ELF/symbols.s b/lld/test/ELF/symbols.s
index ccf83afdf56..e2b55172733 100644
--- a/lld/test/ELF/symbols.s
+++ b/lld/test/ELF/symbols.s
@@ -67,7 +67,7 @@ internal:
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x12000
-// CHECK-NEXT: Offset: 0x2000
+// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 4
// CHECK: Symbols [
diff --git a/lld/test/ELF/tls-offset.s b/lld/test/ELF/tls-offset.s
new file mode 100644
index 00000000000..8f5a46d988d
--- /dev/null
+++ b/lld/test/ELF/tls-offset.s
@@ -0,0 +1,56 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+// RUN: ld.lld %t -o %tout
+// RUN: llvm-readobj -s %tout | FileCheck %s
+
+ .global _start
+_start:
+ retq
+
+ .section .tdata,"awT",@progbits
+ .align 4
+ .long 42
+
+ .section .tbss,"awT",@nobits
+ .align 16
+ .zero 16
+
+ .data
+ .long 1
+
+
+// Test that .tbss doesn't show up in the offset or in the address. If this
+// gets out of sync what we get a runtime is different from what the section
+// table says.
+
+// CHECK: Name: .tdata
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: SHF_TLS
+// CHECK-NEXT: SHF_WRITE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x12000
+// CHECK-NEXT: Offset: 0x2000
+// CHECK-NEXT: Size: 4
+
+// CHECK: Name: .tbss
+// CHECK-NEXT: Type: SHT_NOBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: SHF_TLS
+// CHECK-NEXT: SHF_WRITE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x12010
+// CHECK-NEXT: Offset: 0x2004
+// CHECK-NEXT: Size: 16
+
+// CHECK: Name: .data
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: SHF_WRITE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x12004
+// CHECK-NEXT: Offset: 0x2004
+// CHECK-NEXT: Size: 4
OpenPOWER on IntegriCloud