From 83746fd55a13e47c9b4d33237185965a1ebdb5e4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Dec 2015 10:16:40 -0500 Subject: [PATCH] cmd/link: use current GOROOT for source file paths for standard library 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/internal/obj/obj.go | 6 +++--- src/cmd/link/internal/ld/pcln.go | 15 +++++++++++++++ src/runtime/runtime-gdb_test.go | 6 +++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/cmd/internal/obj/obj.go b/src/cmd/internal/obj/obj.go index af3290d3a5..30ab54912e 100644 --- a/src/cmd/internal/obj/obj.go +++ b/src/cmd/internal/obj/obj.go @@ -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 = "??" diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 669776244c..d1e3c2589b 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -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 diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index 2b7e1d3859..6ebc69a424 100644 --- a/src/runtime/runtime-gdb_test.go +++ b/src/runtime/runtime-gdb_test.go @@ -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 -- 2.50.0