]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: use current GOROOT for source file paths for standard library
authorRuss Cox <rsc@golang.org>
Tue, 29 Dec 2015 15:16:40 +0000 (10:16 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 4 Jan 2016 20:09:57 +0000 (20:09 +0000)
This CL changes the source file information in the
standard library's .a files to say "$GOROOT/src/runtime/chan.go"
(with a literal "$GOROOT") instead of spelling out the actual directory.
The linker then substitutes the actual $GOROOT (or $GOROOT_FINAL)
as appropriate.

If people download a binary distribution to an alternate location,
following the instructions at https://golang.org/doc/install#install,
the code before this CL would end up with source paths pointing to
/usr/local/go no matter where the actual sources were.
Now the source paths for built binaries will point to the actual sources
(hopefully).

The source line information in distributed binaries is not affected:
those will still say /usr/local/go. But binaries people build themselves
(their own programs, not the go distribution programs) will be correct.

Fixing this path also fixes the lookup of the runtime-gdb.py file.

Fixes #5533.

Change-Id: I03729baae3fbd8cd636e016275ee5ad2606e4663
Reviewed-on: https://go-review.googlesource.com/18200
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/internal/obj/obj.go
src/cmd/link/internal/ld/pcln.go
src/runtime/runtime-gdb_test.go

index af3290d3a599d0c19c54d1d83d297ae0afcc89d2..30ab54912ed28f32e7ca0f8716420a9425ebcefe 100644 (file)
@@ -74,15 +74,15 @@ func (h *LineHist) setFile(stk *LineStack, file string) {
                abs = filepath.Join(h.Dir, file)
        }
 
-       // Remove leading TrimPathPrefix, or else rewrite $GOROOT to $GOROOT_FINAL.
+       // Remove leading TrimPathPrefix, or else rewrite $GOROOT to literal $GOROOT.
        if h.TrimPathPrefix != "" && hasPathPrefix(abs, h.TrimPathPrefix) {
                if abs == h.TrimPathPrefix {
                        abs = ""
                } else {
                        abs = abs[len(h.TrimPathPrefix)+1:]
                }
-       } else if h.GOROOT_FINAL != "" && h.GOROOT_FINAL != h.GOROOT && hasPathPrefix(abs, h.GOROOT) {
-               abs = h.GOROOT_FINAL + abs[len(h.GOROOT):]
+       } else if hasPathPrefix(abs, h.GOROOT) {
+               abs = "$GOROOT" + abs[len(h.GOROOT):]
        }
        if abs == "" {
                abs = "??"
index 669776244c19c31264e4398e26d5150ead8a2bab..d1e3c2589b20eba1f83016bac8b1160564c322e5 100644 (file)
@@ -8,6 +8,8 @@ import (
        "cmd/internal/obj"
        "fmt"
        "log"
+       "os"
+       "path/filepath"
 )
 
 // funcpctab writes to dst a pc-value table mapping the code in func to the values
@@ -150,6 +152,7 @@ func renumberfiles(ctxt *Link, files []*LSym, d *Pcdata) {
                        f.Value = int64(ctxt.Nhistfile)
                        f.Type = obj.SFILEPATH
                        f.Next = ctxt.Filesyms
+                       f.Name = expandGoroot(f.Name)
                        ctxt.Filesyms = f
                }
        }
@@ -376,6 +379,18 @@ func pclntab() {
        }
 }
 
+func expandGoroot(s string) string {
+       const n = len("$GOROOT")
+       if len(s) >= n+1 && s[:n] == "$GOROOT" && (s[n] == '/' || s[n] == '\\') {
+               root := goroot
+               if final := os.Getenv("GOROOT_FINAL"); final != "" {
+                       root = final
+               }
+               return filepath.ToSlash(filepath.Join(root, s[n:]))
+       }
+       return s
+}
+
 const (
        BUCKETSIZE    = 256 * MINFUNC
        SUBBUCKETS    = 16
index 2b7e1d38597355148d4ead471064321a7e228f60..6ebc69a4247c7a9e5661785f16f84f778d9b3c6a 100644 (file)
@@ -87,6 +87,7 @@ func TestGdbPython(t *testing.T) {
 
        args := []string{"-nx", "-q", "--batch", "-iex",
                fmt.Sprintf("add-auto-load-safe-path %s/src/runtime", runtime.GOROOT()),
+               "-ex", "info auto-load python-scripts",
                "-ex", "br main.go:10",
                "-ex", "run",
                "-ex", "echo BEGIN info goroutines\n",
@@ -129,7 +130,10 @@ func TestGdbPython(t *testing.T) {
                        t.Skipf("skipping because GOROOT=%s does not exist", runtime.GOROOT())
                }
 
-               t.Fatalf("failed to load Go runtime support: %s", firstLine)
+               _, file, _, _ := runtime.Caller(1)
+
+               t.Logf("package testing source file: %s", file)
+               t.Fatalf("failed to load Go runtime support: %s\n%s", firstLine, got)
        }
 
        // Extract named BEGIN...END blocks from output