Golang二进制文件的包依赖信息解析

Golang二进制文件的包依赖信息解析 有没有办法检查二进制文件的包依赖关系?

4 回复

这听起来像是一个应该存在的工具,因为信息就在二进制文件中……

曾经有一个名为 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二进制文件的包依赖关系。

回到顶部