aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorJoel Sing <joel@sing.id.au>2024-10-24 23:17:28 +1100
committerJoel Sing <joel@sing.id.au>2024-10-29 08:17:00 +0000
commit851ebc2dca616754fa2bd6c48241e498bf306a50 (patch)
tree66dff6efcba5acf67c05d71cdf559148dae8ea41 /src/cmd/internal
parentaef81a75516fa10338cf2e770914fad70037c49c (diff)
downloadgo-851ebc2dca616754fa2bd6c48241e498bf306a50.tar.xz
cmd/internal/objfile,cmd/objdump: add disassembly support for riscv64
Add support to `go tool objdump` for disassembling riscv64 binaries. Revendor to bring in cmd/vendor/golang.org/x/arch/riscv64/riscv64asm, which provides the actual disassembly implementation. Fixes #36738 Change-Id: I0f29968509041c0c5698fc2d6910a6a0bea9d3c0 Cq-Include-Trybots: luci.golang.try:gotip-linux-riscv64 Reviewed-on: https://go-review.googlesource.com/c/go/+/622257 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Carlos Amedee <carlos@golang.org> Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/cmd/internal')
-rw-r--r--src/cmd/internal/objfile/disasm.go18
-rw-r--r--src/cmd/internal/objfile/elf.go4
2 files changed, 21 insertions, 1 deletions
diff --git a/src/cmd/internal/objfile/disasm.go b/src/cmd/internal/objfile/disasm.go
index 77bc1221e9..5a7d288e94 100644
--- a/src/cmd/internal/objfile/disasm.go
+++ b/src/cmd/internal/objfile/disasm.go
@@ -25,6 +25,7 @@ import (
"golang.org/x/arch/arm64/arm64asm"
"golang.org/x/arch/loong64/loong64asm"
"golang.org/x/arch/ppc64/ppc64asm"
+ "golang.org/x/arch/riscv64/riscv64asm"
"golang.org/x/arch/s390x/s390xasm"
"golang.org/x/arch/x86/x86asm"
)
@@ -62,7 +63,7 @@ func (e *Entry) Disasm() (*Disasm, error) {
disasm := disasms[goarch]
byteOrder := byteOrders[goarch]
if disasm == nil || byteOrder == nil {
- return nil, fmt.Errorf("unsupported architecture")
+ return nil, fmt.Errorf("unsupported architecture %q", goarch)
}
// Filter out section symbols, overwriting syms in place.
@@ -398,6 +399,19 @@ func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By
return text, size
}
+func disasm_riscv64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
+ inst, err := riscv64asm.Decode(code)
+ var text string
+ if err != nil || inst.Op == 0 {
+ text = "?"
+ } else if gnuAsm {
+ text = fmt.Sprintf("%-36s // %s", riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc}), riscv64asm.GNUSyntax(inst))
+ } else {
+ text = riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc})
+ }
+ return text, 4
+}
+
func disasm_s390x(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder, gnuAsm bool) (string, int) {
inst, err := s390xasm.Decode(code)
var text string
@@ -423,6 +437,7 @@ var disasms = map[string]disasmFunc{
"loong64": disasm_loong64,
"ppc64": disasm_ppc64,
"ppc64le": disasm_ppc64,
+ "riscv64": disasm_riscv64,
"s390x": disasm_s390x,
}
@@ -434,6 +449,7 @@ var byteOrders = map[string]binary.ByteOrder{
"loong64": binary.LittleEndian,
"ppc64": binary.BigEndian,
"ppc64le": binary.LittleEndian,
+ "riscv64": binary.LittleEndian,
"s390x": binary.BigEndian,
}
diff --git a/src/cmd/internal/objfile/elf.go b/src/cmd/internal/objfile/elf.go
index 9048be7d73..8923290cff 100644
--- a/src/cmd/internal/objfile/elf.go
+++ b/src/cmd/internal/objfile/elf.go
@@ -127,6 +127,10 @@ func (f *elfFile) goarch() string {
return "ppc64le"
}
return "ppc64"
+ case elf.EM_RISCV:
+ if f.elf.Class == elf.ELFCLASS64 {
+ return "riscv64"
+ }
case elf.EM_S390:
return "s390x"
}