go编译和反编译概述

  • 编译
    • -a
    • -p
    • -race
    • gcflags
    • 反编译
      • 方法一
      • 方法二

go是和c语言一样的静态语言,因此也就存在着编译的过程。然后反编译其实是为了看系统的整个调用。

编译

编译主要是通过go build 这个命令去做的。通常的go run main.go其实也是在编译完成之后,直接运行代码里面的main方法。
然后也可以通过,go build 方法,先变成成为可执行文件之后再进行运行,加上-o指定可执行文件需要进行存放的目录。
当然go build 也有很多可以选择的参数,可以在安装完go之后,通过go help build进行查看。
用的比较多的参数有

-a

-a 强制编译,即使是代码没有进行更新,其实就是和makefile有点类似,本身make之后会有缓存,如果代码没有更新,make的时候会提醒.-a 就是即使没有更新也要重新编译。

-p

-p n.这个是后面接上参数的,一般是cpu的数量,缺省是设置的GOMAXPROCS.这个也是go编译这么快的原因之一,可以并发编译。

-race

-race 开启竞态检测,其实也就是检测有没有并发的问题。
接下来我们用一个示例代码,下面的代码明显是有着并发的问题。然后看看不加-race和加了的区别

package mainimport ("fmt"
)func main() {var a inta = 1go func() {a++}()go func() {a++}()fmt.Printf("is int:%v\n", a)}

不加-race

加了race

因为截屏显示的问题,把内容都复制出来。

==================
WARNING: DATA RACE
Read at 0x00c0000b8018 by main goroutine:main.main()/Users/wangjian01/Documents/go/learn/study/runtime/map/t1.go:20 +0x134Previous write at 0x00c0000b8018 by goroutine 7:main.main.func1()/Users/wangjian01/Documents/go/learn/study/runtime/map/t1.go:13 +0x44Goroutine 7 (finished) created at:main.main()/Users/wangjian01/Documents/go/learn/study/runtime/map/t1.go:12 +0xbd
==================
is int:3
Found 1 data race(s)

很明显看这个不同的goroutine的读写操作说明的很清楚,因此需要根据提示做出加锁或者进行原子等操作避免。

我们试一下正确的代码下的输出。这个是加了读写锁的代码。

package mainimport ("fmt""sync"
)func main() {var a inta = 1var lock sync.RWMutexgo func() {lock.Lock()a++lock.Unlock()}()go func() {lock.Lock()a++lock.Unlock()}()lock.RLock()fmt.Printf("is int:%v\n", a)lock.RUnlock()}

再加上-race进行编译,看已经没问题了

gcflags

go build 可以用-gcflags给go编译器传入参数,也就是传给go tool compile的参数,因此可以用go tool compile --help查看所有可用的参数。

其中-m可以检查代码的编译优化情况,包括逃逸情况和函数是否内联。

如果只在编译特定包时需要传递参数,格式应遵守“包名=参数列表”,如go build -gcflags -gcflags=‘log=-N -l’ main.go

go build用-ldflags给go链接器传入参数,实际是给go tool link的参数,可以用go tool link --help查看可用的参数。

常用-X来指定版本号等编译时才决定的参数值。例如代码中定义var buildVer string,然后在编译时用go build -ldflags “-X main.buildVer=1.0” … 来赋值。注意-X只能给string类型变量赋值。

通常为了调试的参数是-N参数代表禁止优化, -l参数代表禁止内联,

反编译

主要是为了底层如何运行,而将二进制文件转换成了汇编文件。

方法一

先编译成二进制,然后通过二进制文件,反编译成汇编文件。以上面的为例,

go build -o main
go tool objdump -S main > plan9.asm

然后看一下结果,因为比较多这里只截图一部分,

忽略其中的汇编,可以看到对于lock.RLock()的底层调用,对于我们的分析底层还是很有帮助的。

方法二

   go tool compile -S -+ -l -m t1.go > plan9.asm

通过compile这个工具,可以看出编译器的整个过程,上面的是-m生成的效果,编译器的优化。

【go编译和反编译概述】相关推荐

  1. 《编译与反编译技术实战 》一2.3 编译器的设计与实现概述

    本节书摘来自华章出版社<编译与反编译技术实战 >一书中的第2章,第2.3节,庞建民 主编 ,刘晓楠 陶红伟 岳 峰 戴超 编著,更多章节内容可以访问云栖社区"华章计算机" ...

  2. 《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

    本节书摘来自华章计算机<编译与反编译技术实战>一书中的第1章,第1.1节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...

  3. 《编译与反编译技术实战》——第2章编译器实践概述

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章编译器实践概述,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区"公众号查看 第2章 ...

  4. 《编译与反编译技术实战》——导读

    前 言 "编译技术"是从事软件开发和信息安全相关工作的技术人员必须掌握的基础性技术,也是高等院校计算机科学与技术和软件专业的一门必修专业课,这是理论与实践结合非常强的领域,对提升开 ...

  5. 《编译与反编译技术实战》——2.1节编译器、解释器及其工作方式

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章,第2.1节编译器.解释器及其工作方式,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区&quo ...

  6. python源代码的后缀名是_Python代码编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  7. 《编译与反编译技术》——第一章 引论 1.1节编译器与解释器

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.1节,作者庞建民,陶红伟,刘晓楠,岳峰.更多章节内容可以访问云栖社区"华章计算机"公众号查看. 人类之间 ...

  8. 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译

    反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载; -- CSDN 下载地址 : http://download.csdn.net/detai ...

  9. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

最新文章

  1. 【NIO】Selector
  2. tcp/ip协议中消息传输对帧消息的操作
  3. Aria2:轻量命令行下载工具
  4. 这不是bug,而是语言特性
  5. 下载mysql镜像教程_docker下安装mysql镜像
  6. HDU 1850 Being a Good Boy in Spring Festival
  7. DOM包裹wrap()方法
  8. 使用mmap实现大文件的复制:单进程与多进程情况
  9. 前端学习(1609):路由进阶和高阶
  10. margin为负值的几种情况
  11. .htaccess 基础教程(四)Apache RewriteCond 规则参数
  12. display:none的进一步理解
  13. vscode:设置语言为中文
  14. 高三计算机专业vb试题二答案,高三计算机专业VB试题(二)
  15. 7年弹指一挥间:iOS演进史
  16. 关于巴伦——Marchand巴伦
  17. CSS+HTML实现学成在线静态页面
  18. What 引导的三种名词性从句
  19. Java基础练习(十二)集合与数组工具类使用,BigDecimal使用,实现二分查找,快速排序
  20. 酱香型白酒正在被认识

热门文章

  1. 《AutoCAD 2014中文版实用教程》一一1.2 标题栏
  2. 各种管理系统的UML建模图
  3. Uni-app 课程详情页 获取课程详情 + 收藏 + 加入购物车
  4. linux安装到什么硬盘比较好,硬盘安装四大发行版Linux比较
  5. arduino控制物联网平台微型花园系统设计
  6. python调用cplex求解装箱问题_装箱问题的CPLEX求解
  7. 利用正则表达式爬取网络小说,并按照章节下载到本地
  8. 【水滴石穿】github_popular
  9. 微信小程序中的html路径,新媒体运营:如何提取微信小程序路径到指定页面
  10. 更换Linux启动logo的总结