blob: 3b6cb6e1c3ce55e682075de517ac55927dda58ae [file] [log] [blame]
Jackson Cooper-Driver728b4142025-05-14 14:53:04 +01001#!/usr/bin/env python3
2#-------------------------------------------------------------------------------
3# SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7#-------------------------------------------------------------------------------
8
9import sys
10import re
11from datetime import datetime
12
13def load_symbols_to_keep(symbols):
14 return [re.compile(x.replace('*', '.*')) for x in symbols]
15
16def 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
40if __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)