from .enums import (
ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64, ENUM_RELOC_TYPE_MIPS,
ENUM_RELOC_TYPE_ARM, ENUM_RELOC_TYPE_AARCH64, ENUM_RELOC_TYPE_PPC64,
- ENUM_D_TAG)
+ ENUM_RELOC_TYPE_BPF, ENUM_D_TAG)
from ..construct import Container
recipe = self._RELOCATION_RECIPES_AARCH64.get(reloc_type, None)
elif self.elffile.get_machine_arch() == '64-bit PowerPC':
recipe = self._RELOCATION_RECIPES_PPC64.get(reloc_type, None)
+ elif self.elffile.get_machine_arch() == 'Linux BPF - in-kernel virtual machine':
+ recipe = self._RELOCATION_RECIPES_EBPF.get(reloc_type, None)
if recipe is None:
raise ELFRelocationError(
def _arm_reloc_calc_sym_plus_value_pcrel(value, sym_value, offset, addend=0):
return sym_value // 4 + value - offset // 4
+ def _bpf_64_32_reloc_calc_sym_plus_addend(value, sym_value, offset, addend=0):
+ return (sym_value + addend) // 8 - 1
+
_RELOCATION_RECIPES_ARM = {
ENUM_RELOC_TYPE_ARM['R_ARM_ABS32']: _RELOCATION_RECIPE_TYPE(
bytesize=4, has_addend=False,
bytesize=4, has_addend=True, calc_func=_reloc_calc_sym_plus_addend),
}
+ # https://www.kernel.org/doc/html/latest/bpf/llvm_reloc.html#different-relocation-types
+ _RELOCATION_RECIPES_EBPF = {
+ ENUM_RELOC_TYPE_BPF['R_BPF_NONE']: _RELOCATION_RECIPE_TYPE(
+ bytesize=8, has_addend=False, calc_func=_reloc_calc_identity),
+ ENUM_RELOC_TYPE_BPF['R_BPF_64_64']: _RELOCATION_RECIPE_TYPE(
+ bytesize=8, has_addend=False, calc_func=_reloc_calc_identity),
+ ENUM_RELOC_TYPE_BPF['R_BPF_64_32']: _RELOCATION_RECIPE_TYPE(
+ bytesize=8, has_addend=False, calc_func=_bpf_64_32_reloc_calc_sym_plus_addend),
+ ENUM_RELOC_TYPE_BPF['R_BPF_64_NODYLD32']: _RELOCATION_RECIPE_TYPE(
+ bytesize=4, has_addend=False, calc_func=_reloc_calc_identity),
+ ENUM_RELOC_TYPE_BPF['R_BPF_64_ABS64']: _RELOCATION_RECIPE_TYPE(
+ bytesize=8, has_addend=False, calc_func=_reloc_calc_identity),
+ ENUM_RELOC_TYPE_BPF['R_BPF_64_ABS32']: _RELOCATION_RECIPE_TYPE(
+ bytesize=4, has_addend=False, calc_func=_reloc_calc_identity),
+ }
+