Golang二进制反汇编

Go的源码是Plan 9汇编与Go语言的混合使用,即有汇编调用Go,也有Go调用汇编。在很多情况下,直接看汇编代码更直观,特别是在研究编译器生成的函数实现时更有用。下面介绍两种反汇编方法:

假设有个helloworld.go程序,源码如下:

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}

先将代码编译成二进制,命令如下:

go build --gcflags="-l -N" -o helloworld

会生成一个helloworld的二进制,--gcflags="-l -N"参数的作用是去掉编译器优化,使生成的汇编代码与编写的代码更相近,同时也方便GDB调试。

反汇编成AT&T汇编

AT&T是Linux操作系统最常用的汇编语言,Linux系统提供的objdump工具也是将二进制反编译成AT&T汇编,命令如下:

objdump -d helloworld > att.asm

最终反汇编的结果放在了att.asm文件。下面是汇编结果(截取了部分代码):

0000000000487200 <main.main>:
  487200:   64 48 8b 0c 25 f8 ff    mov    %fs:0xfffffffffffffff8,%rcx
  487207:   ff ff  
  487209:   48 3b 61 10             cmp    0x10(%rcx),%rsp
  48720d:   76 7a                   jbe    487289 <main.main+0x89>
  48720f:   48 83 ec 68             sub    $0x68,%rsp
  487213:   48 89 6c 24 60          mov    %rbp,0x60(%rsp)
  487218:   48 8d 6c 24 60          lea    0x60(%rsp),%rbp
  48721d:   0f 57 c0                xorps  %xmm0,%xmm0
  487220:   0f 11 44 24 38          movups %xmm0,0x38(%rsp)
  487225:   48 8d 44 24 38          lea    0x38(%rsp),%rax
  ...

反汇编成Plan 9汇编

Plan 9目前看到的只有Go语言在用,而且网上的资料很匮乏,学习成本挺高的,但如果学会了Plan 9汇编,再看Go源码会非常简单,而且可以通过Go调用汇编写出高效率代码。要把二进制反汇编成Plan 9汇编,也只能用Go提供的工具,命令如下:

go tool objdump -S helloworld > plan9.asm

最终反汇编的结果放在了plan9.asm文件。下面是汇编结果(截取了部分代码):

TEXT main.main(SB) /root/program/golang/helloworld/helloworld.go
func main() {
  0x487200      64488b0c25f8ffffff  MOVQ FS:0xfffffff8, CX  
  0x487209      483b6110        CMPQ 0x10(CX), SP   
  0x48720d      767a            JBE 0x487289       
  0x48720f      4883ec68        SUBQ $0x68, SP      
  0x487213      48896c2460      MOVQ BP, 0x60(SP)   
  0x487218      488d6c2460      LEAQ 0x60(SP), BP   
    fmt.Println("Hello, World!")
  0x48721d      0f57c0          XORPS X0, X0       
  0x487220      0f11442438      MOVUPS X0, 0x38(SP)     
  0x487225      488d442438      LEAQ 0x38(SP), AX       
  0x48722a      4889442430      MOVQ AX, 0x30(SP)

建议

从上面展示的结果来看,两种汇编还是有点差别的。在学习Go源码时,选择用哪种汇编去看这个要根据自已的实际情况来。我的建议先必须对AT&T汇编有一定了解,因为Plan 9汇编资料实在是太少了,甚至没有一个对命令的完整介绍,一个没有汇编基础的人直接看Plan 9的一些文档,绝对会一脸绝望。在整理网上一些Plan 9汇编资料时,发现都是讲的Plan 9与AT&T的差异,所以只有了解AT&T,才能进一步学好Plan 9汇编。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mac Prometheus 是一种用于监控和警报的开源软件,它提供了广泛的监控功能,可用于监控各种应用程序和服务,包括使用 golang 编写的二进制文件。 要在 Mac 上使用 Prometheus 监控 golang 二进制文件,首先需要安装并配置 Prometheus 和相关的组件。可以通过 Homebrew 或手动从 Prometheus 的官方网站下载安装包。安装完后,需要在 Prometheus 的配置文件中指定要监控的目标和指标。 在 golang 二进制文件中,可以通过 Prometheus 客户端库来暴露自定义的指标。该库提供了一组函数,可以在代码中调用,以便将自定义的指标暴露给 Prometheus。这些指标可以是应用程序的各个方面,如请求处理时间、内存占用、并发连接数等等。 一旦 golang 二进制文件中的指标暴露出来,Prometheus 就可以通过配置文件中的目标来收集这些指标。Prometheus 会按照配置的时间间隔定期访问这些目标,收集指标数据并存储起来。你可以使用 Prometheus 的查询语言 PromQL 来分析和查询这些指标数据,并使用 PromQL 表达式设置警报规则。 为了在 Mac 上实现 golang 二进制文件的监控,你需要编写相应的 golang 代码来使用 Prometheus 客户端库暴露指标。然后,在 Prometheus 的配置文件中指定该 golang 二进制文件的地址作为监控目标。最后,启动 Prometheus 服务,并使用 Prometheus 的界面或 API 来查看和管理指标数据。 总之,通过 Mac Prometheus 监控 golang 二进制文件,你可以轻松地收集和分析应用程序的各种指标,并设置警报规则以监控应用程序的健康状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值