Source code for cle.backends.elf.relocation

import importlib
import logging
import os
from collections import defaultdict

import archinfo

from cle.backends.relocation import Relocation

ALL_RELOCATIONS = defaultdict(dict)
complaint_log = set()

path = os.path.dirname(os.path.abspath(__file__))
log = logging.getLogger(name=__name__)


[docs] def load_relocations(): for filename in os.listdir(path): if not filename.endswith(".py"): continue if filename == "__init__.py": continue log.debug("Importing ELF relocation module: %s", filename[:-3]) module = importlib.import_module(".%s" % filename[:-3], "cle.backends.elf.relocation") try: arch_name = module.arch except AttributeError: continue for item_name in dir(module): if item_name not in archinfo.defines: continue item = getattr(module, item_name) if not isinstance(item, type) or not issubclass(item, Relocation): continue ALL_RELOCATIONS[arch_name][archinfo.defines[item_name]] = item
[docs] def get_relocation(arch, r_type): if r_type == 0: return None try: return ALL_RELOCATIONS[arch][r_type] except KeyError: if (arch, r_type) not in complaint_log: complaint_log.add((arch, r_type)) log.warning("Unknown reloc %d on %s", r_type, arch) return None
load_relocations()