in pkg/elfparser/elf.go [632:688]
func (e *elfLoader) doLoadELF(inputData BpfCustomData) (map[string]BpfData, map[string]ebpf_maps.BpfMap, error) {
var err error
//Parse all sections
if err := e.parseSection(); err != nil {
fmt.Println(err)
return nil, nil, fmt.Errorf("failed to parse sections in elf file")
}
//Parse Map
parsedMapData, err := e.parseMap(inputData)
if err != nil {
return nil, nil, fmt.Errorf("failed to parse maps")
}
//Load Map
loadedMapData, err := e.loadMap(parsedMapData)
if err != nil {
return nil, nil, fmt.Errorf("failed to load maps")
}
//Parse Prog, need to pass loadedMapData for applying relocation
parsedProgData, err := e.parseProg(loadedMapData)
if err != nil {
return nil, nil, fmt.Errorf("failed to parse prog")
}
//Load prog
loadedProgData, err := e.loadProg(parsedProgData, loadedMapData)
if err != nil {
return nil, nil, fmt.Errorf("failed to load progs")
}
//Link loaded map with prog
for pgmPinPath := range loadedProgData {
progMaps := make(map[string]ebpf_maps.BpfMap)
if pgmEntry, ok := loadedProgData[pgmPinPath]; ok {
associatedmapIDs, err := e.bpfProgApi.GetBPFProgAssociatedMapsIDs(pgmEntry.Program.ProgFD)
if err != nil {
log.Infof("Failed to load prog")
return nil, nil, fmt.Errorf("failed to Load the prog, get associatedmapIDs failed")
}
//walk thru all mapIDs and get loaded FDs and fill BPFData
for mapInfoIdx := 0; mapInfoIdx < len(associatedmapIDs); mapInfoIdx++ {
mapID := associatedmapIDs[mapInfoIdx]
if mapName, ok := parsedProgData[pgmPinPath].AssociatedMaps[int(mapID)]; ok {
progMaps[mapName] = loadedMapData[mapName]
log.Infof("Found %s with ID %d and FD %d", mapName, progMaps[mapName].MapID, progMaps[mapName].MapFD)
}
}
pgmEntry.Maps = progMaps
loadedProgData[pgmPinPath] = pgmEntry
}
}
return loadedProgData, loadedMapData, nil
}