blob: 3187b4d6439995e7a81aea198ae4d0a4d3f2a8d7 [file] [log] [blame]
# This test builds a cgo binary and verifies the source directory path
# does not appear in the binary, either literally or in compressed DWARF.
# TODO(golang.org/issue/36072): ideally we should build a binary from identical
# sources in different directories and verify the binary and all intermediate
# files are identical.
[short] skip
[!cgo] skip
# Check that the source path appears when -trimpath is not used.
go build -o hello.exe .
grep -q gopath[/\\]src hello.exe
go run ./list-dwarf hello.exe
stdout gopath[/\\]src
# Check that the source path does not appear when -trimpath is used.
[aix] stop # can't inspect XCOFF binaries
go build -trimpath -o hello.exe .
! grep -q gopath[/\\]src hello.exe
go run ./list-dwarf hello.exe
! stdout gopath/src
# Do the above, with the cgo (but not .c) sources in an overlay
# Check that the source path appears when -trimpath is not used.
mkdir $WORK/overlay
cp hello.go $WORK/overlay/hello.go
mkdir hello_overlay
cp hello.c hello_overlay/hello.c
go build -overlay overlay.json -o hello_overlay.exe ./hello_overlay
grep -q gopath[/\\]src hello_overlay.exe
! grep -q $WORK[/\\]overlay hello_overlay.exe
go run ./list-dwarf hello_overlay.exe
stdout gopath[/\\]src
! stdout $WORK[/\\]overlay
# Check that the source path does not appear when -trimpath is used.
go build -overlay overlay.json -trimpath -o hello_overlay.exe ./hello_overlay
! grep -q gopath[/\\]src hello_overlay.exe
! grep -q $WORK[/\\]overlay hello_overlay.exe
go run ./list-dwarf hello_overlay.exe
! stdout gopath/src
! stdout $WORK[/\\]overlay
-- go.mod --
module m
go 1.14
-- overlay.json --
{
"Replace": {
"hello_overlay/hello.go": "../../overlay/hello.go"
}
}
-- hello.c --
#include <stdio.h>
void say_hello() { puts("Hello, world!\n"); }
-- hello.go --
package main
// void say_hello();
import "C"
func main() {
C.say_hello()
}
-- list-dwarf/list-dwarf.go --
package main
import (
"debug/dwarf"
"fmt"
"io"
"log"
"os"
"sort"
)
func main() {
files, err := run(os.Args[1])
if err != nil {
log.Fatal(err)
}
for _, file := range files {
fmt.Println(file)
}
}
func run(exePath string) ([]string, error) {
dwarfData, err := readDWARF(exePath)
if err != nil {
return nil, err
}
dwarfReader := dwarfData.Reader()
files := make(map[string]bool)
for {
e, err := dwarfReader.Next()
if err != nil {
return nil, err
}
if e == nil {
break
}
lr, err := dwarfData.LineReader(e)
if err != nil {
return nil, err
}
if lr == nil {
continue
}
var le dwarf.LineEntry
for {
if err := lr.Next(&le); err != nil {
if err == io.EOF {
break
}
return nil, err
}
files[le.File.Name] = true
}
}
sortedFiles := make([]string, 0, len(files))
for file := range files {
sortedFiles = append(sortedFiles, file)
}
sort.Strings(sortedFiles)
return sortedFiles, nil
}
-- list-dwarf/read_darwin.go --
package main
import (
"debug/dwarf"
"debug/macho"
)
func readDWARF(exePath string) (*dwarf.Data, error) {
machoFile, err := macho.Open(exePath)
if err != nil {
return nil, err
}
defer machoFile.Close()
return machoFile.DWARF()
}
-- list-dwarf/read_elf.go --
// +build android dragonfly freebsd illumos linux netbsd openbsd solaris
package main
import (
"debug/dwarf"
"debug/elf"
)
func readDWARF(exePath string) (*dwarf.Data, error) {
elfFile, err := elf.Open(exePath)
if err != nil {
return nil, err
}
defer elfFile.Close()
return elfFile.DWARF()
}
-- list-dwarf/read_windows.go --
package main
import (
"debug/dwarf"
"debug/pe"
)
func readDWARF(exePath string) (*dwarf.Data, error) {
peFile, err := pe.Open(exePath)
if err != nil {
return nil, err
}
defer peFile.Close()
return peFile.DWARF()
}