Jackson Cooper-Driver | 728b414 | 2025-05-14 14:53:04 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | #------------------------------------------------------------------------------- |
| 3 | # SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors |
| 4 | # |
| 5 | # SPDX-License-Identifier: BSD-3-Clause |
| 6 | # |
| 7 | #------------------------------------------------------------------------------- |
| 8 | |
| 9 | import sys |
| 10 | import re |
| 11 | from datetime import datetime |
| 12 | |
| 13 | def load_symbols_to_keep(symbols): |
| 14 | return [re.compile(x.replace('*', '.*')) for x in symbols] |
| 15 | |
| 16 | def convert_fromelf_to_symdefs(fromelf_lines, symbols_to_keep): |
| 17 | lines = [] |
| 18 | lines.append(f"#<SYMDEFS># Generated from fromelf --text -s: Last Updated: {datetime.now()}\n") |
| 19 | |
| 20 | pattern = re.compile(r"\s*\d+\s+(\S+)\s+(?:\n\s+)?(0x[0-9a-fA-F]+)\s+(\S+)\s+(\S+)\s+(\S+)") |
| 21 | |
| 22 | for match in pattern.finditer(fromelf_lines): |
| 23 | symbol, address, bind, section, stype = match.groups() |
| 24 | |
| 25 | if not any(p.search(symbol) for p in symbols_to_keep): |
| 26 | continue |
| 27 | |
| 28 | # Normalize symbol type |
| 29 | if stype == "Code": |
| 30 | sym_type = "T" |
| 31 | elif stype == "Data": |
| 32 | sym_type = "D" |
| 33 | else: |
| 34 | sym_type = "N" # Unknown or other |
| 35 | |
| 36 | lines.append(f"{address} {sym_type} {symbol}\n") |
| 37 | |
| 38 | return lines |
| 39 | |
| 40 | if __name__ == "__main__": |
| 41 | fromelf_path = sys.argv[1] |
| 42 | output_path = sys.argv[2] |
| 43 | symbols_list = sys.argv[3:] |
| 44 | |
| 45 | symbols_to_keep = load_symbols_to_keep(symbols_list) |
| 46 | |
| 47 | with open(fromelf_path, "r") as f: |
| 48 | fromelf_lines = f.read() |
| 49 | |
| 50 | newlines = convert_fromelf_to_symdefs(fromelf_lines, symbols_to_keep) |
| 51 | |
| 52 | with open(output_path, "w") as f: |
| 53 | f.writelines(newlines) |