• Russ Cox's avatar
    cmd/link: set runtime.GOROOT default during link · 8396015e
    Russ Cox authored
    Suppose you build the Go toolchain in directory A,
    move the whole thing to directory B, and then use
    it from B to build a new program hello.exe, and then
    run hello.exe, and hello.exe crashes with a stack
    trace into the standard library.
    
    Long ago, you'd have seen hello.exe print file names
    in the A directory tree, even though the files had moved
    to the B directory tree. About two years ago we changed
    the compiler to write down these files with the name
    "$GOROOT" (that literal string) instead of A, so that the
    final link from B could replace "$GOROOT" with B,
    so that hello.exe's crash would show the correct source
    file paths in the stack trace. (golang.org/cl/18200)
    
    Now suppose that you do the same thing but hello.exe
    doesn't crash: it prints fmt.Println(runtime.GOROOT()).
    And you run hello.exe after clearing $GOROOT from the
    environment.
    
    Long ago, you'd have seen hello.exe print A instead of B.
    Before this CL, you'd still see hello.exe print A instead of B.
    This case is the one instance where a moved toolchain
    still divulges its origin. Not anymore. After this CL, hello.exe
    will print B, because the linker sets runtime/internal/sys.DefaultGoroot
    with the effective GOROOT from link time.
    This makes the default result of runtime.GOROOT once again
    match the file names recorded in the binary, after two years
    of divergence.
    
    With that cleared up, we can reintroduce GOROOT into the
    link action ID and also reenable TestExecutableGOROOT/RelocatedExe.
    
    When $GOROOT_FINAL is set during link, it is used
    in preference to $GOROOT, as always, but it was easier
    to explain the behavior above without introducing that
    complication.
    
    Fixes #22155.
    Fixes #20284.
    Fixes #22475.
    
    Change-Id: Ifdaeb77fd4678fdb337cf59ee25b2cd873ec1016
    Reviewed-on: https://go-review.googlesource.com/86835
    Run-TryBot: Russ Cox <rsc@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    8396015e
dwarf_test.go 2.7 KB