in pkg/elfparser/elf.go [230:282]
func (e *elfLoader) parseRelocationSection(reloSection *elf.Section, elfFile *elf.File) ([]relocationEntry, error) {
var result []relocationEntry
symbols, err := elfFile.Symbols()
if err != nil {
return nil, fmt.Errorf("unable to load symbols(): %v", err)
}
// Read section data
data, err := reloSection.Data()
if err != nil {
return nil, fmt.Errorf("unable to read data from section '%s': %v", reloSection.Name, err)
}
reader := bytes.NewReader(data)
for {
var err error
var offset, index int
switch elfFile.Class {
case elf.ELFCLASS64:
var relocEntry elf.Rel64
err = binary.Read(reader, elfFile.ByteOrder, &relocEntry)
index = int(elf.R_SYM64(relocEntry.Info)) - 1
offset = int(relocEntry.Off)
case elf.ELFCLASS32:
var relocEntry elf.Rel32
err = binary.Read(reader, elfFile.ByteOrder, &relocEntry)
index = int(elf.R_SYM32(relocEntry.Info)) - 1
offset = int(relocEntry.Off)
default:
return nil, fmt.Errorf("unsupported arch %v", elfFile.Class)
}
if err != nil {
// EOF. Nothing more to do.
if err == io.EOF {
return result, nil
}
return nil, err
}
// Validate the derived index value
if index >= len(symbols) {
return nil, fmt.Errorf("invalid Relocation section entry'%v': index %v does not exist",
reloSection, index)
}
log.Infof("Relocation section entry: %s @ %v", symbols[index].Name, offset)
result = append(result, relocationEntry{
relOffset: offset,
symbol: symbols[index],
})
}
}