关于golang:Go118-新特性编译后的二进制文件将包含更多信息

54次阅读

共计 1546 个字符,预计需要花费 4 分钟才能阅读完成。

大家好,我是煎鱼。

我有一个敌人,,开开心心入职,想着施展拳脚,第一个工作就是对老旧的二进制文件进行钻研。

他一看,这文件,不晓得是编译器用什么参数怎么打进去的,环境不晓得是什么,更不晓得来自什么代码分支?

这除了是我的项目流程上的问题外,Go 在这块也有相似的小问题,解决起来比拟麻烦。

背景

日常中很难从 Go 二进制文件中检索元信息,要么是信息齐全缺失,要么提取须要对二进制文件进行大量解析。

蕴含的元信息如下:

元信息 提取处
Go 构建版本 符号表,通过全局变量 runtime.buildVersion 来获取
构建信息,例如:模块和版本 符号表,通过全局变量 runtime/debug.modinfo 来获取
编译器选项,例如:构建模式、编译器、gcflags、ldflags 等 无奈获取
用户定义的自定义数据,例如:应用程序版本等 需在编译时设置全局字符串变量,才能够获取

关注到编译器选项,也就是参数等都是无奈得悉的,也就是会进步获取如何编译进去的难度。

新提案

Michael Obermüller 提出了一个新的提案《cmd/go: add compiler flags, relevant env vars to ‘go version -m’ output》用于解决上述问题。

在提案中想要的是 JSON 格局的构造输入:

{
    "version": "go1.13.4",
    "compileropts": {
        "compiler": "gc",
        "mode": "pie",
        "os": "linux",
        ...
    },
    "buildinfo": {
        "path": "脑子进煎鱼了",
        "main": {
            "path": "HelloWorld",
            "version": "(devel)",
        },
        "deps": []},
    "user": {
        "customkey": "customval",
        ...
    }
}

Russ Cox 示意因为编译信息已有既有格局,并且默认应用 JSON 只会让二进制文件变得更大。益处少,没必要,改为了选项化的反对。

新的 Go1.18 版本中,能够通过既有的:

go version -m

查看到提案所提到的信息。

例如:

$ gotip version
go version devel go1.18-eba0e866fa Mon Oct 18 22:56:07 2021 +0000 darwin/amd64
$ gotip build ./
$ gotip version -m ko
...
    build    compiler    gc
    build    tags    goexperiment.regabiwrappers,goexperiment.regabireflect,goexperiment.regabiargs
    build    CGO_ENABLED    true
    build    CGO_CPPFLAGS    
    build    CGO_CFLAGS    
    build    CGO_CXXFLAGS    
    build    CGO_LDFLAGS    
    build    gitrevision    6447264ff8b5d48aff64000f81bb0847aefc7bac
    build    gituncommitted    true

若须要输入 JSON 格局,也能够通过指定 go version -json 达到一样的成果。

在下面的输入中,现有的编译器选项等都会蕴含在内,可能让大家对整体编译后的二进制文件溯源有一个更好的认知。

总结

在明天这篇文章中,给大家介绍了 Go1.18 的一个新的变动。

新版本中,编译器选项 / 参数、相干环境变量等,将会蕴含在编译后的二进制文件中,可能更便于前人排查和查看信息。

若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

正文完
 0