Commit b2363ee9 authored by Wei Xiao's avatar Wei Xiao Committed by Cherry Zhang

cmd/internal/objabi: fix the bug of shrinking SymType down to a uint8

Previous CL (cmd/internal/objabi: shrink SymType down to a uint8) shrinks
SymType down to a uint8 but forgot making according change in goobj.

Fixes #20296
Also add a test to catch such Goobj format inconsistency bug

Change-Id: Ib43dd7122cfcacf611a643814e95f8c5a924941f
Reviewed-on: https://go-review.googlesource.com/42971
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarMichael Hudson-Doyle <michael.hudson@canonical.com>
Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
parent 5088b64b
......@@ -507,7 +507,7 @@ func (r *objReader) parseObject(prefix []byte) error {
break
}
typ := r.readInt()
typ := r.readByte()
s := &Sym{SymID: r.readSymID()}
r.p.Syms = append(r.p.Syms, s)
s.Kind = objabi.SymKind(typ)
......
......@@ -56,7 +56,7 @@
// Each symbol is laid out as the following fields:
//
// - byte 0xfe (sanity check for synchronization)
// - type [int]
// - type [byte]
// - name & version [symref index]
// - flags [int]
// 1<<0 dupok
......
......@@ -201,3 +201,50 @@ func TestDisasmExtld(t *testing.T) {
}
testDisasm(t, false, "-ldflags=-linkmode=external")
}
func TestDisasmGoobj(t *testing.T) {
switch runtime.GOARCH {
case "arm":
t.Skipf("skipping on %s, issue 19811", 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)
}
hello := filepath.Join(tmp, "hello.o")
args := []string{"tool", "compile", "-o", hello}
args = append(args, "testdata/fmthello.go")
out, err := exec.Command(testenv.GoToolPath(t), args...).CombinedOutput()
if err != nil {
t.Fatalf("go tool compile fmthello.go: %v\n%s", err, out)
}
need := []string{
"main(SB)",
"fmthello.go:6",
}
args = []string{
"-s", "main",
hello,
}
out, err = exec.Command(exe, args...).CombinedOutput()
if err != nil {
t.Fatalf("objdump fmthello.o: %v\n%s", err, out)
}
text := string(out)
ok := true
for _, s := range need {
if !strings.Contains(text, s) {
t.Errorf("disassembly missing '%s'", s)
ok = false
}
}
if !ok {
t.Logf("full disassembly:\n%s", text)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment