Golang二进制文件的包依赖信息解析
Golang二进制文件的包依赖信息解析 有没有办法检查二进制文件的包依赖关系?
这听起来像是一个应该存在的工具,因为信息就在二进制文件中……
曾经有一个名为 gobin 的工具做了类似的事情:https://github.com/rjeczalik/bin,但自从模块出现以来,它可以做得更多,而且看起来它已经有一段时间没有维护了。
更多关于Golang二进制文件的包依赖信息解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您提供了有用的仓库。 事实上,我也一直在寻找一种方法来检查二进制文件的包依赖及其版本。 问题在于从主应用程序使用 go 插件。 我拥有主应用程序的二进制文件,但对其依赖项或版本一无所知。 这就是为什么我试图检查二进制文件的依赖信息。
sukill:
我只有主应用程序的二进制文件,对其依赖或版本信息一无所知。 这就是为什么我试图检查二进制文件的依赖信息。
你总是可以尝试使用 strings 这个 Unix 工具,然后在二进制文件中查找感兴趣的字符串…
在Go语言中,可以使用go version -m命令来检查二进制文件的包依赖信息。这个命令会显示二进制文件构建时使用的模块版本信息。
示例代码:
# 构建一个示例二进制文件
go build -o myapp main.go
# 检查二进制文件的依赖信息
go version -m myapp
输出示例:
myapp: go1.19
path github.com/example/myapp
mod github.com/example/myapp (devel)
dep github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJ8KsM...
dep golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:0A+M6Uqn+Eje4kHMK80...
对于更详细的依赖分析,可以使用go tool nm配合grep来查看二进制文件中的符号信息:
# 查看所有导入的包符号
go tool nm myapp | grep ' T ' | grep '\.'
如果需要以编程方式解析,可以使用标准库debug/elf(Linux)或debug/macho(macOS)或debug/pe(Windows):
package main
import (
"debug/elf"
"fmt"
"log"
)
func main() {
f, err := elf.Open("myapp")
if err != nil {
log.Fatal(err)
}
defer f.Close()
// 查看动态符号表(如果有)
syms, err := f.DynamicSymbols()
if err != nil {
log.Fatal(err)
}
for _, s := range syms {
fmt.Printf("Symbol: %s\n", s.Name)
}
}
对于Go特定的依赖信息,可以使用runtime/debug读取构建信息:
package main
import (
"fmt"
"runtime/debug"
)
func main() {
info, ok := debug.ReadBuildInfo()
if !ok {
fmt.Println("No build info available")
return
}
fmt.Printf("Main module: %s %s\n", info.Main.Path, info.Main.Version)
for _, dep := range info.Deps {
fmt.Printf("Dependency: %s %s\n", dep.Path, dep.Version)
}
}
这些方法可以有效地检查和分析Go二进制文件的包依赖关系。

