From c31231ccab371b31f5563a91e68720657799fe70 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 24 May 2017 16:21:01 -0400 Subject: [PATCH] debug/dwarf: heuristically handle both UNIX and Windows paths Currently debug/dwarf assumes all paths in line tables will be UNIX-style paths, which obviously isn't the case for binaries built on Windows. However, we can't simply switch from the path package to the filepath package because we don't know that we're running on the same host type that built the binary and we want this to work even if we're not. This is essentially the approach taken by GDB, which treats paths in accordance with the system GDB itself is compiled for. In fact, we can't even guess the compilation system from the type of the binary because it may have been cross-compiled. We fix this by heuristically determining whether paths are UNIX-style or DOS-style by looking for a drive letter or UNC path. If we see a DOS-style path, we use appropriate logic for determining whether the path is absolute and for joining two paths. This is helped by the fact that we should basically always be starting with an absolute path. However, it could mistake a relative UNIX-style path that begins with a directory like "C:" for an absolute DOS-style path. There doesn't seem to be any way around this. Fixes #19784. Change-Id: Ie13b546d2f1dcd8b02e668583a627b571b281588 Reviewed-on: https://go-review.googlesource.com/44017 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Alex Brainman --- src/debug/dwarf/export_test.go | 7 ++ src/debug/dwarf/line.go | 74 ++++++++++++++++++- src/debug/dwarf/line_test.go | 85 ++++++++++++++++++++++ src/debug/dwarf/testdata/line-gcc-win.bin | Bin 0 -> 133202 bytes src/debug/dwarf/type_test.go | 14 ++++ 5 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 src/debug/dwarf/export_test.go create mode 100644 src/debug/dwarf/testdata/line-gcc-win.bin diff --git a/src/debug/dwarf/export_test.go b/src/debug/dwarf/export_test.go new file mode 100644 index 0000000000..b8a25ff531 --- /dev/null +++ b/src/debug/dwarf/export_test.go @@ -0,0 +1,7 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dwarf + +var PathJoin = pathJoin diff --git a/src/debug/dwarf/line.go b/src/debug/dwarf/line.go index ed82feef92..4e6e1429d9 100644 --- a/src/debug/dwarf/line.go +++ b/src/debug/dwarf/line.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "path" + "strings" ) // A LineReader reads a sequence of LineEntry structures from a DWARF @@ -247,10 +248,10 @@ func (r *LineReader) readHeader() error { if len(directory) == 0 { break } - if !path.IsAbs(directory) { + if !pathIsAbs(directory) { // Relative paths are implicitly relative to // the compilation directory. - directory = path.Join(r.directories[0], directory) + directory = pathJoin(r.directories[0], directory) } r.directories = append(r.directories, directory) } @@ -283,11 +284,11 @@ func (r *LineReader) readFileEntry() (bool, error) { } off := r.buf.off dirIndex := int(r.buf.uint()) - if !path.IsAbs(name) { + if !pathIsAbs(name) { if dirIndex >= len(r.directories) { return false, DecodeError{"line", off, "directory index too large"} } - name = path.Join(r.directories[dirIndex], name) + name = pathJoin(r.directories[dirIndex], name) } mtime := r.buf.uint() length := int(r.buf.uint()) @@ -588,3 +589,68 @@ func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error { *entry = next } } + +// pathIsAbs returns whether path is an absolute path (or "full path +// name" in DWARF parlance). This is in "whatever form makes sense for +// the host system", so this accepts both UNIX-style and DOS-style +// absolute paths. We avoid the filepath package because we want this +// to behave the same regardless of our host system and because we +// don't know what system the paths came from. +func pathIsAbs(path string) bool { + _, path = splitDrive(path) + return len(path) > 0 && (path[0] == '/' || path[0] == '\\') +} + +// pathJoin joins dirname and filename. filename must be relative. +// DWARF paths can be UNIX-style or DOS-style, so this handles both. +func pathJoin(dirname, filename string) string { + if len(dirname) == 0 { + return filename + } + // dirname should be absolute, which means we can determine + // whether it's a DOS path reasonably reliably by looking for + // a drive letter or UNC path. + drive, dirname := splitDrive(dirname) + if drive == "" { + // UNIX-style path. + return path.Join(dirname, filename) + } + // DOS-style path. + drive2, filename := splitDrive(filename) + if drive2 != "" { + if strings.ToLower(drive) != strings.ToLower(drive2) { + // Different drives. There's not much we can + // do here, so just ignore the directory. + return drive2 + filename + } + // Drives are the same. Ignore drive on filename. + } + if !(strings.HasSuffix(dirname, "/") || strings.HasSuffix(dirname, `\`)) && dirname != "" { + dirname += `\` + } + return drive + dirname + filename +} + +// splitDrive splits the DOS drive letter or UNC share point from +// path, if any. path == drive + rest +func splitDrive(path string) (drive, rest string) { + if len(path) >= 2 && path[1] == ':' { + if c := path[0]; 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { + return path[:2], path[2:] + } + } + if len(path) > 3 && (path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/') { + // Normalize the path so we can search for just \ below. + npath := strings.Replace(path, "/", `\`, -1) + // Get the host part, which must be non-empty. + slash1 := strings.IndexByte(npath[2:], '\\') + 2 + if slash1 > 2 { + // Get the mount-point part, which must be non-empty. + slash2 := strings.IndexByte(npath[slash1+1:], '\\') + slash1 + 1 + if slash2 > slash1 { + return path[:slash2], path[slash2:] + } + } + } + return "", path +} diff --git a/src/debug/dwarf/line_test.go b/src/debug/dwarf/line_test.go index cc363f5478..11a254464a 100644 --- a/src/debug/dwarf/line_test.go +++ b/src/debug/dwarf/line_test.go @@ -7,6 +7,7 @@ package dwarf_test import ( . "debug/dwarf" "io" + "strings" "testing" ) @@ -46,6 +47,46 @@ func TestLineELFGCC(t *testing.T) { testLineTable(t, want, elfData(t, "testdata/line-gcc.elf")) } +func TestLineGCCWindows(t *testing.T) { + // Generated by: + // > gcc --version + // gcc (tdm64-1) 4.9.2 + // > gcc -g -o line-gcc-win.bin line1.c C:\workdir\go\src\debug\dwarf\testdata\line2.c + + toWindows := func(lf *LineFile) *LineFile { + lf2 := *lf + lf2.Name = strings.Replace(lf2.Name, "/home/austin/go.dev/", "C:\\workdir\\go\\", -1) + lf2.Name = strings.Replace(lf2.Name, "/", "\\", -1) + return &lf2 + } + file1C := toWindows(file1C) + file1H := toWindows(file1H) + file2C := toWindows(file2C) + + // Line table based on objdump --dwarf=rawline,decodedline + want := []LineEntry{ + {Address: 0x401530, File: file1H, Line: 2, IsStmt: true}, + {Address: 0x401538, File: file1H, Line: 5, IsStmt: true}, + {Address: 0x401541, File: file1H, Line: 6, IsStmt: true, Discriminator: 3}, + {Address: 0x40154b, File: file1H, Line: 5, IsStmt: true, Discriminator: 3}, + {Address: 0x40154f, File: file1H, Line: 5, IsStmt: false, Discriminator: 1}, + {Address: 0x401555, File: file1H, Line: 7, IsStmt: true}, + {Address: 0x40155b, File: file1C, Line: 6, IsStmt: true}, + {Address: 0x401563, File: file1C, Line: 6, IsStmt: true}, + {Address: 0x401568, File: file1C, Line: 7, IsStmt: true}, + {Address: 0x40156d, File: file1C, Line: 8, IsStmt: true}, + {Address: 0x401572, File: file1C, Line: 9, IsStmt: true}, + {Address: 0x401578, EndSequence: true}, + + {Address: 0x401580, File: file2C, Line: 4, IsStmt: true}, + {Address: 0x401588, File: file2C, Line: 5, IsStmt: true}, + {Address: 0x401595, File: file2C, Line: 6, IsStmt: true}, + {Address: 0x40159b, EndSequence: true}, + } + + testLineTable(t, want, peData(t, "testdata/line-gcc-win.bin")) +} + func TestLineELFClang(t *testing.T) { // Generated by: // # clang --version | head -n1 @@ -183,6 +224,11 @@ func testLineTable(t *testing.T, want []LineEntry, d *Data) { } t.Fatal("lr.Next:", err) } + // Ignore sources from the Windows build environment. + if strings.HasPrefix(line.File.Name, "C:\\crossdev\\") || + strings.HasPrefix(line.File.Name, "C:/crossdev/") { + continue + } got = append(got, line) } } @@ -227,3 +273,42 @@ func dumpLines(t *testing.T, lines []LineEntry) { t.Logf(" %+v File:%+v", l, l.File) } } + +type joinTest struct { + dirname, filename string + path string +} + +var joinTests = []joinTest{ + {"a", "b", "a/b"}, + {"a", "", "a"}, + {"", "b", "b"}, + {"/a", "b", "/a/b"}, + {"/a/", "b", "/a/b"}, + + {`C:\Windows\`, `System32`, `C:\Windows\System32`}, + {`C:\Windows\`, ``, `C:\Windows\`}, + {`C:\`, `Windows`, `C:\Windows`}, + {`C:\Windows\`, `C:System32`, `C:\Windows\System32`}, + {`C:\Windows`, `a/b`, `C:\Windows\a/b`}, + {`\\host\share\`, `foo`, `\\host\share\foo`}, + {`\\host\share\`, `foo\bar`, `\\host\share\foo\bar`}, + {`//host/share/`, `foo/bar`, `//host/share/foo/bar`}, + + // The following are "best effort". We shouldn't see relative + // base directories in DWARF, but these test that pathJoin + // doesn't fail miserably if it sees one. + {`C:`, `a`, `C:a`}, + {`C:`, `a\b`, `C:a\b`}, + {`C:.`, `a`, `C:.\a`}, + {`C:a`, `b`, `C:a\b`}, +} + +func TestPathJoin(t *testing.T) { + for _, test := range joinTests { + got := PathJoin(test.dirname, test.filename) + if test.path != got { + t.Errorf("pathJoin(%q, %q) = %q, want %q", test.dirname, test.filename, got, test.path) + } + } +} diff --git a/src/debug/dwarf/testdata/line-gcc-win.bin b/src/debug/dwarf/testdata/line-gcc-win.bin new file mode 100644 index 0000000000000000000000000000000000000000..583ad44dd07dabb77cadb01043a45e50295ae7d4 GIT binary patch literal 133202 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 YLhg02QYYTpdgiR$Vd@!cpv5`=FMF}4$N&HU literal 0 HcmV?d00001 diff --git a/src/debug/dwarf/type_test.go b/src/debug/dwarf/type_test.go index 0283466f08..6c06731ea1 100644 --- a/src/debug/dwarf/type_test.go +++ b/src/debug/dwarf/type_test.go @@ -8,6 +8,7 @@ import ( . "debug/dwarf" "debug/elf" "debug/macho" + "debug/pe" "testing" ) @@ -67,6 +68,19 @@ func machoData(t *testing.T, name string) *Data { return d } +func peData(t *testing.T, name string) *Data { + f, err := pe.Open(name) + if err != nil { + t.Fatal(err) + } + + d, err := f.DWARF() + if err != nil { + t.Fatal(err) + } + return d +} + func TestTypedefsELF(t *testing.T) { testTypedefs(t, elfData(t, "testdata/typedef.elf"), "elf") } func TestTypedefsMachO(t *testing.T) { -- 2.50.0