botw/tools/print_decomp_symbols.py

59 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
from colorama import Fore, Style
import diff_settings
import subprocess
import utils
parser = argparse.ArgumentParser(description="Prints build/uking.elf symbols")
parser.add_argument("--print-undefined", "-u",
help="Print symbols that are undefined", action="store_true")
parser.add_argument("--print-c2-d2", "-c",
help="Print C2/D2 (base object constructor/destructor) symbols", action="store_true")
parser.add_argument("--hide-unknown", "-H",
help="Hide symbols that are not present in the original game", action="store_true")
parser.add_argument("--all", "-a", action="store_true")
args = parser.parse_args()
listed_decomp_symbols = {info.decomp_name for info in utils.get_functions()}
original_symbols = {info.name for info in utils.get_functions()}
config: dict = dict()
diff_settings.apply(config, {})
myimg: str = config["myimg"]
entries = [x.strip().split() for x in subprocess.check_output(["nm", myimg], text=True).split("\n")]
for entry in entries:
if len(entry) == 3:
addr = int(entry[0], 16)
symbol_type: str = entry[1]
name = entry[2]
if (symbol_type == "T" or symbol_type == "W") and (args.all or name not in listed_decomp_symbols):
c1_name = name.replace("C2", "C1")
is_c2_ctor = "C2" in name and c1_name in listed_decomp_symbols and utils.are_demangled_names_equal(
c1_name, name)
d1_name = name.replace("D2", "D1")
is_d2_dtor = "D2" in name and d1_name in listed_decomp_symbols and utils.are_demangled_names_equal(
d1_name, name)
if args.print_c2_d2 or not (is_c2_ctor or is_d2_dtor):
color = Fore.YELLOW
if name in original_symbols:
color = Fore.RED
elif args.hide_unknown:
continue
if is_c2_ctor or is_d2_dtor:
color += Style.DIM
print(f"{color}UNLISTED {Fore.RESET} {utils.format_symbol_name(name)}")
elif len(entry) == 2:
symbol_type = entry[0]
name = entry[1]
if symbol_type.upper() == "U" and args.print_undefined:
print(f"{Fore.CYAN}UNDEFINED{Style.RESET_ALL} {utils.format_symbol_name(name)}")