mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/objdump: print Go code alongside assembly
Added -S flag to print go source file line above corresponding disassembly:
$ go tool objdump -S -s main.main fmthello
TEXT main.main(SB) /home/rugginoso/Documents/src/go/src/cmd/objdump/testdata/fmthello.go
func main() {
0x47d450 64488b0c25f8ffffff FS MOVQ FS:0xfffffff8, CX
0x47d459 483b6110 CMPQ 0x10(CX), SP
0x47d45d 7631 JBE 0x47d490
0x47d45f 4883ec18 SUBQ $0x18, SP
0x47d463 48896c2410 MOVQ BP, 0x10(SP)
0x47d468 488d6c2410 LEAQ 0x10(SP), BP
Println("hello, world")
0x47d46d 488d0563b00200 LEAQ 0x2b063(IP), AX
0x47d474 48890424 MOVQ AX, 0(SP)
0x47d478 48c74424080c000000 MOVQ $0xc, 0x8(SP)
0x47d481 e81a000000 CALL main.Println(SB)
}
0x47d486 488b6c2410 MOVQ 0x10(SP), BP
0x47d48b 4883c418 ADDQ $0x18, SP
0x47d48f c3 RET
func main() {
0x47d490 e8ebf1fcff CALL runtime.morestack_noctxt(SB)
0x47d495 ebb9 JMP main.main(SB)
Execution time:
$ time go tool objdump testdata/fmthello > /dev/null
real 0m0.430s
user 0m0.440s
sys 0m0.000s
$ time go tool objdump -S testdata/fmthello > /dev/null
real 0m0.471s
user 0m0.476s
sys 0m0.012s
Fixes #18245
Change-Id: I9b2f8338f9ee443c1352efd270d3ba85e3dd9b78
Reviewed-on: https://go-review.googlesource.com/37953
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
acc1f47299
commit
476f55fd8a
3 changed files with 141 additions and 17 deletions
|
|
@ -57,24 +57,18 @@ func buildObjdump() error {
|
|||
}
|
||||
|
||||
var x86Need = []string{
|
||||
"fmthello.go:6",
|
||||
"TEXT main.main(SB)",
|
||||
"JMP main.main(SB)",
|
||||
"CALL main.Println(SB)",
|
||||
"RET",
|
||||
}
|
||||
|
||||
var armNeed = []string{
|
||||
"fmthello.go:6",
|
||||
"TEXT main.main(SB)",
|
||||
//"B.LS main.main(SB)", // TODO(rsc): restore; golang.org/issue/9021
|
||||
"BL main.Println(SB)",
|
||||
"RET",
|
||||
}
|
||||
|
||||
var ppcNeed = []string{
|
||||
"fmthello.go:6",
|
||||
"TEXT main.main(SB)",
|
||||
"BR main.main(SB)",
|
||||
"CALL main.Println(SB)",
|
||||
"RET",
|
||||
|
|
@ -91,7 +85,7 @@ var target = flag.String("target", "", "test disassembly of `goos/goarch` binary
|
|||
// binary for the current system (only) and test that objdump
|
||||
// can handle that one.
|
||||
|
||||
func testDisasm(t *testing.T, flags ...string) {
|
||||
func testDisasm(t *testing.T, printCode bool, flags ...string) {
|
||||
goarch := runtime.GOARCH
|
||||
if *target != "" {
|
||||
f := strings.Split(*target, "/")
|
||||
|
|
@ -114,9 +108,15 @@ func testDisasm(t *testing.T, flags ...string) {
|
|||
t.Fatalf("go build fmthello.go: %v\n%s", err, out)
|
||||
}
|
||||
need := []string{
|
||||
"fmthello.go:6",
|
||||
"TEXT main.main(SB)",
|
||||
}
|
||||
|
||||
if printCode {
|
||||
need = append(need, ` Println("hello, world")`)
|
||||
} else {
|
||||
need = append(need, "fmthello.go:6")
|
||||
}
|
||||
|
||||
switch goarch {
|
||||
case "amd64", "386":
|
||||
need = append(need, x86Need...)
|
||||
|
|
@ -126,7 +126,16 @@ func testDisasm(t *testing.T, flags ...string) {
|
|||
need = append(need, ppcNeed...)
|
||||
}
|
||||
|
||||
out, err = exec.Command(exe, "-s", "main.main", hello).CombinedOutput()
|
||||
args = []string{
|
||||
"-s", "main.main",
|
||||
hello,
|
||||
}
|
||||
|
||||
if printCode {
|
||||
args = append([]string{"-S"}, args...)
|
||||
}
|
||||
|
||||
out, err = exec.Command(exe, args...).CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("objdump fmthello.exe: %v\n%s", err, out)
|
||||
}
|
||||
|
|
@ -153,7 +162,19 @@ func TestDisasm(t *testing.T) {
|
|||
case "s390x":
|
||||
t.Skipf("skipping on %s, issue 15255", runtime.GOARCH)
|
||||
}
|
||||
testDisasm(t)
|
||||
testDisasm(t, false)
|
||||
}
|
||||
|
||||
func TestDisasmCode(t *testing.T) {
|
||||
switch runtime.GOARCH {
|
||||
case "arm64":
|
||||
t.Skipf("skipping on %s, issue 10106", runtime.GOARCH)
|
||||
case "mips", "mipsle", "mips64", "mips64le":
|
||||
t.Skipf("skipping on %s, issue 12559", runtime.GOARCH)
|
||||
case "s390x":
|
||||
t.Skipf("skipping on %s, issue 15255", runtime.GOARCH)
|
||||
}
|
||||
testDisasm(t, true)
|
||||
}
|
||||
|
||||
func TestDisasmExtld(t *testing.T) {
|
||||
|
|
@ -178,5 +199,5 @@ func TestDisasmExtld(t *testing.T) {
|
|||
if !build.Default.CgoEnabled {
|
||||
t.Skip("skipping because cgo is not enabled")
|
||||
}
|
||||
testDisasm(t, "-ldflags=-linkmode=external")
|
||||
testDisasm(t, false, "-ldflags=-linkmode=external")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue