mirror of https://github.com/zeldaret/botw.git
59 lines
2.3 KiB
Python
Executable File
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)}")
|