1 回答

TA貢獻1825條經驗 獲得超4個贊
實際上,我已經結合了 VonC 答案和我的運行時方法。
所有需要的數據都存儲在runtime.firstmoduledata- struct 但它們不會被導出。要從那里讀取數據,我再次讀取我的可執行文件(僅針對 ELF 實現),找到此符號并執行其他部分,如 runtime.Caller() 函數。此方法不可移植,并且可以通過運行時庫中的更改來破壞,但它可以工作。
selfReflect 函數使用運行時庫中私有類型的副本
https://github.com/martende/restartable/blob/master/restartable.go#L208
func selfReflect(filename string) ([]string,error) {
f,err := elf.Open(filename)
if err != nil {
return nil,err
}
defer f.Close()
syms,err := f.Symbols()
if err != nil {
return nil,err
}
var modSym elf.Symbol
var modSymFound = false
for _,v := range syms {
if v.Name == "runtime.firstmoduledata" {
modSym = v
modSymFound = true
break
}
}
if ! modSymFound {
return nil,errors.New("elfparse:nosym")
}
var datap = (*moduledata)(unsafe.Pointer(uintptr(modSym.Value)))
files := make([]string,0)
for i := range datap.filetab {
bp := &datap.pclntable[datap.filetab[i]]
file := C.GoString( (*C.char) (unsafe.Pointer(bp)) )
if file != "<autogenerated>" && file != "@" {
if _, err := os.Stat(file); err == nil {
files = append(files ,file)
}
}
}
return files,nil
}
- 1 回答
- 0 關注
- 233 瀏覽
添加回答
舉報