Skip to content

Commit

Permalink
[lld/mac] Test zerofill sections after __thread_bss
Browse files Browse the repository at this point in the history
Real zerofill sections go after __thread_bss, since zerofill sections
must all be at the end of their segment and __thread_bss must be right
after __thread_data.

Works fine already, but wasn't tested as far as I can tell.

Also tweak comment about zerofill sections a bit.

No behavior change.

Differential Revision: https://reviews.llvm.org/D104609
  • Loading branch information
nico committed Jun 21, 2021
1 parent 62ed024 commit e6cb55d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
6 changes: 4 additions & 2 deletions lld/MachO/OutputSegment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,10 @@ static int sectionOrder(OutputSection *osec) {
.Case(section_names::codeSignature, std::numeric_limits<int>::max())
.Default(osec->inputOrder);
}
// ZeroFill sections must always be the at the end of their segments,
// otherwise subsequent sections may get overwritten with zeroes at runtime.
// ZeroFill sections must always be the at the end of their segments:
// dyld checks if a segment's file size is smaller than its in-memory
// size to detect if a segment has zerofill sections, and if so it maps
// the missing tail as zerofill.
if (sectionType(osec->flags) == S_ZEROFILL)
return std::numeric_limits<int>::max();
return osec->inputOrder;
Expand Down
26 changes: 25 additions & 1 deletion lld/test/MachO/tlv-dylib.s
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,29 @@
# FLAGS-NEXT: segname __DATA
# FLAGS-NEXT: addr
# FLAGS-NEXT: size 0x0000000000000008
# FLAGS-NEXT: offset
# FLAGS-NEXT: offset 0
# FLAGS-NEXT: align 2^3 (8)
# FLAGS-NEXT: reloff 0
# FLAGS-NEXT: nreloc 0
# FLAGS-NEXT: type S_THREAD_LOCAL_ZEROFILL
# FLAGS: sectname __bss
# FLAGS-NEXT: segname __DATA
# FLAGS-NEXT: addr
# FLAGS-NEXT: size 0x0000000000002000
# FLAGS-NEXT: offset 0
# FLAGS-NEXT: align 2^0 (1)
# FLAGS-NEXT: reloff 0
# FLAGS-NEXT: nreloc 0
# FLAGS-NEXT: type S_ZEROFILL
# FLAGS: sectname __common
# FLAGS-NEXT: segname __DATA
# FLAGS-NEXT: addr
# FLAGS-NEXT: size 0x0000000000004000
# FLAGS-NEXT: offset 0
# FLAGS-NEXT: align 2^14 (16384)
# FLAGS-NEXT: reloff 0
# FLAGS-NEXT: nreloc 0
# FLAGS-NEXT: type S_ZEROFILL

#--- libtlv.s
.section __DATA,__thread_vars,thread_local_variables
Expand All @@ -95,6 +113,12 @@ _main:

## Add some TLVs to test too, so that we can test the ordering
## of __thread_ptrs, __thread_data, and __thread_bss.
## Also add a .bss and a .comm for good measure too. Since they
## are both zerofill, they end up after __thread_bss.
.comm _com, 0x4000
.bss
.zero 0x2000

.section __DATA,__thread_data,thread_local_regular
_tfoo$tlv$init:
.quad 123
Expand Down

0 comments on commit e6cb55d

Please sign in to comment.