1
0
mirror of https://github.com/golang/go synced 2024-11-18 06:54:49 -07:00

cmd/link: don't split container symbols when write blocks

We split the output into blocks and write them in parallel. The
block boundary is placed at symbol boundary. In the case of outer
symbols and sub symbols, currently we may split an outer symbol
into two blocks. This will be bad, as the two blocks will have
overlapping address range, since outer symbol and its sub symbols
occupies the same address range.

Make sure we place block boundary only at top-level symbol
boundaries.

Fix boringcrypto build.

Change-Id: I56811d3969c65c6be97672d8e1f1ea36b2447465
Reviewed-on: https://go-review.googlesource.com/c/go/+/227957
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
(cherry picked from commit 636fa3148f)
Reviewed-on: https://go-review.googlesource.com/c/go/+/228138
This commit is contained in:
Cherry Zhang 2020-04-10 22:11:51 -04:00
parent 1b15c7f102
commit ca017a6fb9

View File

@ -812,6 +812,10 @@ func writeBlocks(out *OutBuf, sem chan int, syms []*sym.Symbol, addr, size int64
// Find the last symbol we'd write.
idx := -1
for i, s := range syms {
if s.Attr.SubSymbol() {
continue
}
// If the next symbol's size would put us out of bounds on the total length,
// stop looking.
if s.Value+s.Size > lastAddr {
@ -839,7 +843,15 @@ func writeBlocks(out *OutBuf, sem chan int, syms []*sym.Symbol, addr, size int64
// blocks or at the end.
length := int64(0)
if idx+1 < len(syms) {
length = syms[idx+1].Value - addr
// Find the next top-level symbol.
// Skip over sub symbols so we won't split a containter symbol
// into two blocks.
next := syms[idx+1]
for next.Attr.SubSymbol() {
idx++
next = syms[idx+1]
}
length = next.Value - addr
}
if length == 0 || length > lastAddr-addr {
length = lastAddr - addr