diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-23 18:39:55 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-23 18:39:55 +0000 |
| commit | 75baf09be5a4e9d8223fa18e1d28f130ba5460de (patch) | |
| tree | 3389d76f061be26d921d97d9177d672ee3965efb | |
| parent | 62b7f7a398a46e7c6cbe6709fab3c5b04de653a3 (diff) | |
| download | bcm5719-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.cpp | 3 | ||||
| -rw-r--r-- | lld/test/ELF/relocation-copy-i686.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/relocation-copy.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/symbols.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/tls-offset.s | 56 |
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 |

