gpt4 book ai didi

go - 如何提取自己的符号表

转载 作者:IT王子 更新时间:2023-10-29 02:22:14 59 4
gpt4 key购买 nike

我正在查看 debug/gosym 包,它的类型为 gosym.Table,据称是 Go 可执行文件的符号表。不幸的是,我没有看到任何从正在运行的程序中提取 sysmbol 表的方法(缺少 Go 反射,我需要比它能提供的更多的信息,特别是导出符号的名称)。

如果这通常不可能,但可以在 Linux 上/对于 ELF 二进制文件完成,那也是一种选择。

最佳答案

在go(Linux)中获取当前运行进程的符号表:

var symTable *gosym.Table
var symTableLoadFailed bool

func loadSymbolTableLinux() {
if symTable != nil || symTableLoadFailed {
return
}

// Try to load from memory first
const elfStartAddress = uintptr(0x400000)
const maxSize = 0x10000000
processMemory := (*[maxSize]byte)(unsafe.Pointer(elfStartAddress))[:maxSize:maxSize]
exe, err := elf.NewFile(bytes.NewReader(processMemory))
if err != nil {
// Failing that, load a copy from disk
exePath, err := os.Executable()
if err != nil {
symTableLoadFailed = true
log.Printf("subvert: Error finding executable: %v", err)
return
}

exe, err = elf.Open(exePath)
if err != nil {
symTableLoadFailed = true
log.Printf("subvert: Error opening %v: %v", exePath, err)
return
}
}
defer exe.Close()

lineTableData, err := exe.Section(".gopclntab").Data()
if err != nil {
symTableLoadFailed = true
log.Printf("subvert: Error reading .gopclntab data: %v", err)
return
}

addr := exe.Section(".text").Addr
lineTable := gosym.NewLineTable(lineTableData, addr)
symTable, err = gosym.NewTable([]byte{}, lineTable)
if err != nil {
symTableLoadFailed = true
log.Printf("subvert: Error creating symbol table: %v", err)
symTable = nil
}
}

也在这里实现:https://github.com/kstenerud/go-subvert/blob/master/subvert.go#L165

关于go - 如何提取自己的符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42554900/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com