diff options
| author | Léo Lam <leo@leolam.fr> | 2020-11-09 19:13:35 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-11-09 19:16:37 +0100 |
| commit | 5d09d99b1bbee904b03e3f0b86cf166d5aea2c2a (patch) | |
| tree | 1805c6c8c98e5cfc87aa92b429ac9d72c890456f /tools/dump_function.py | |
| parent | d5bdc23ef530bea4dc6705ac779710367ae5d839 (diff) | |
tools: Deduplicate code
Diffstat (limited to 'tools/dump_function.py')
| -rwxr-xr-x | tools/dump_function.py | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/tools/dump_function.py b/tools/dump_function.py index c26901a1..638cc501 100755 --- a/tools/dump_function.py +++ b/tools/dump_function.py @@ -1,48 +1,15 @@ #!/usr/bin/env python3 import argparse -from elftools.elf.elffile import ELFFile -import diff_settings -from pathlib import Path -from typing import Any, Dict -import utils -config: Dict[str, Any] = {} -diff_settings.apply(config, {}) - -root = Path(__file__).parent.parent -my_elf = ELFFile((root / config["myimg"]).open("rb")) -my_symtab = my_elf.get_section_by_name(".symtab") -if not my_symtab: - utils.fail(f'{config["myimg"]} has no symbol table') - - -def get_file_offset(elf, addr: int) -> int: - for seg in elf.iter_segments(): - if seg.header["p_type"] != "PT_LOAD": - continue - if seg["p_vaddr"] <= addr < seg["p_vaddr"] + seg["p_filesz"]: - return addr - seg["p_vaddr"] + seg["p_offset"] - assert False - - -def get_symbol_file_offset_and_size(elf, table, name: str) -> (int, int): - syms = table.get_symbol_by_name(name) - if not syms or len(syms) != 1: - raise KeyError(name) - return get_file_offset(elf, syms[0]["st_value"]), syms[0]["st_size"] - - -def get_fn_from_my_elf(name: str) -> bytes: - offset, size = get_symbol_file_offset_and_size(my_elf, my_symtab, name) - my_elf.stream.seek(offset) - return my_elf.stream.read(size) +import util.elf +from util import utils def dump_fn(name: str) -> None: - expected_dir = root / "expected" + expected_dir = utils.get_repo_root() / "expected" try: - fn = get_fn_from_my_elf(name) + fn = util.elf.get_fn_from_my_elf(name) path = expected_dir / f"{name}.bin" path.parent.mkdir(exist_ok=True) path.write_bytes(fn) |
