На самом деле я объединил VonC-ответ и мою поддержку времени.
Все необходимые данные хранятся в runtime.firstmoduledata
- struct, но они не экспортируются. Чтобы прочитать данные оттуда, я снова прочитал свой исполняемый файл (реализованный только для ELF), найдите этот символ и выполните другую часть, такую как функция runtime.Caller(). Этот метод не является переносимым и может быть нарушен изменениями в библиотеке времени выполнения, но он работает.
selfReflect
функция использует копию личных типов от выполнения Lib
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
}
Я использую 'пойти список -f "{{.ImportPath}} {{.Deps}}" мой/program' чтобы получить все зависимости, и я получаю их во временной подпапке. Я использую это для зависимостей поставщиков: https://gist.github.com/VonC/51fe08c5bd79334b6e1ccdd498d4d2bc. Но это не то, что вам нужно или что означает «выборка всех исходных файлов, которые используются во время компиляции». – VonC