• David Crawshaw's avatar
    cmd/link: optimize TLS IE to LE in build mode PIE · 44ee2b00
    David Crawshaw authored
    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/28540Reviewed-by: default avatarIan 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>
    44ee2b00
lib.go 53.1 KB