[PATCH] D106986: [ELF] Add two new tests showing broken .tbss alignment if first in PT_TLS

Jessica Clarke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 28 12:37:56 PDT 2021


jrtc27 created this revision.
jrtc27 added a reviewer: MaskRay.
Herald added a subscriber: emaste.
jrtc27 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This is a similar problem to D66658 <https://reviews.llvm.org/D66658>, where we are too aggressive in not
aligning NOBITS sections, and the tests are based on the ones added for
that fix. If a .tbss section is first in a PT_TLS segment (i.e. there is
no .tdata section) then, although it doesn't need to be aligned such
that address and offset are congruent modulo the page size, they do need
to be congruent modulo the segment alignment, otherwise the whole PT_TLS
will be unaligned.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D106986

Files:
  lld/test/ELF/linkerscript/tls-nobits-offset.s
  lld/test/ELF/tls-nobits-offset.s


Index: lld/test/ELF/tls-nobits-offset.s
===================================================================
--- /dev/null
+++ lld/test/ELF/tls-nobits-offset.s
@@ -0,0 +1,22 @@
+# REQUIRES: aarch64
+# RUN: llvm-mc -filetype=obj -triple=aarch64 %s -o %t.o
+# RUN: ld.lld %t.o -o %t
+# RUN: llvm-readelf -S -l %t | FileCheck %s
+
+## If a SHT_NOBITS section is the only section of a PT_TLS segment,
+## p_offset will be set to the sh_offset field of the section. Check we align
+## sh_offset to sh_addr modulo p_align, so that p_vaddr=p_offset (mod
+## p_align).
+## TODO: Currently we fail to ensure this, as shown by this test
+
+# CHECK: Name  Type   Address          Off     Size   ES Flg Lk Inf Al
+# CHECK: .tbss NOBITS 0000000000211000 000158  000001 00 WAT  0   0 4096
+
+# CHECK: Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
+# CHECK: TLS  0x000158 0x0000000000211000 0x0000000000211000 0x000000 0x000001 R   0x1000
+
+# CHECK: 02 .tbss
+
+.tbss
+.p2align 12
+.byte 0
Index: lld/test/ELF/linkerscript/tls-nobits-offset.s
===================================================================
--- /dev/null
+++ lld/test/ELF/linkerscript/tls-nobits-offset.s
@@ -0,0 +1,31 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN:         .sec1          : { . += 1; } \
+# RUN:         .tbss          : { *(.tbss) } \
+# RUN:       };" > %t.script
+# RUN: ld.lld %t.o -T %t.script -o %t
+# RUN: llvm-readelf -S -l %t | FileCheck %s
+
+## If a SHT_NOBITS section is the only section of a PT_TLS segment,
+## p_offset will be set to the sh_offset field of the section. Check we align
+## sh_offset to sh_addr modulo p_align, so that p_vaddr=p_offset (mod
+## p_align).
+## TODO: Currently we fail to ensure this, as shown by this test
+
+# CHECK:      Name  Type     Address          Off     Size
+# CHECK-NEXT:       NULL     0000000000000000 000000  000000
+# CHECK-NEXT: .text PROGBITS 0000000000000000 000190  000000
+# CHECK-NEXT: .sec1 PROGBITS 0000000000000000 001000  000001
+# CHECK-NEXT: .tbss NOBITS   0000000000000400 001001  000001
+
+# CHECK:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
+# CHECK-NEXT: LOAD 0x001000 0x0000000000000000 0x0000000000000000 0x000001 0x000001 R   0x1000
+# CHECK-NEXT: TLS  0x001001 0x0000000000000400 0x0000000000000400 0x000000 0x000001 R   0x400
+
+# CHECK:      00 .sec1 {{$}}
+# CHECK:      01 .tbss {{$}}
+
+.tbss
+.p2align 10
+.byte 0


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D106986.362496.patch
Type: text/x-patch
Size: 2521 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210728/54d291d3/attachment.bin>


More information about the llvm-commits mailing list