亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang 從編譯文件中獲取所有文件路徑

golang 從編譯文件中獲取所有文件路徑

Go
米琪卡哇伊 2022-01-10 16:40:09
我正在嘗試獲取在編譯期間使用的所有源文件。函數 runtime.Caller() 和帶有堆棧跟蹤的恐慌顯示此信息。我需要這樣的東西func fetchUsedFiles() []string {    ....}func main() {    log.Println("Used Files",fetchUsedFiles())}UPS:我需要的只是以某種方式讀取“runtime.firstmoduledata”變量內容。但它不是導出變量。
查看完整描述

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

}


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號