mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: optimize TLS IE to LE in build mode PIE
When cmd/compile generates position-independent code on linux (the -shared flag), it refers to runtime.tlsg as a TLS IE variable. When cmd/link is linking a PIE executable internally, all TLS IE relocations are generated by cmd/compile, and the variable they refer to, runtime.tlsg, is local to the binary. This means we can optimize this particular IE case to LE, and thus implement IE support when internally linking. To do this optimization in the linker, we need to rewrite the PC-relative MOVD to a constant load. This may seem like an unconscionable act born of enthusiasm, but it turns out this is standard operating procedure for linkers. GNU gold does exactly the same optimization. I spent some time reading it and documented at least one missing feature from this version. Part of adding PIE internal linking on linux/amd64. Change-Id: I1eb068d0ec774724944c6b308aa5084582ecde0b Reviewed-on: https://go-review.googlesource.com/28540 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
1fe4c81282
commit
44ee2b00db
4 changed files with 53 additions and 1 deletions
|
|
@ -111,6 +111,14 @@ type Arch struct {
|
|||
Append16 func(b []byte, v uint16) []byte
|
||||
Append32 func(b []byte, v uint32) []byte
|
||||
Append64 func(b []byte, v uint64) []byte
|
||||
|
||||
// TLSIEtoLE converts a TLS Initial Executable relocation to
|
||||
// a TLS Local Executable relocation.
|
||||
//
|
||||
// This is possible when a TLS IE relocation refers to a local
|
||||
// symbol in an executable, which is typical when internally
|
||||
// linking PIE binaries.
|
||||
TLSIEtoLE func(s *Symbol, off, size int)
|
||||
}
|
||||
|
||||
var (
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue