From f19d229fa43c300fb49053b7da32f419a861e303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 4 Oct 2020 22:05:40 +0200 Subject: [PATCH] Check for non-matching functions that now match --- data/uking_functions.csv | 8 ++++---- tools/check.py | 21 ++++++++++++++------- tools/utils.py | 23 +++++++++++++++++------ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 86c83ff7..c085b6a1 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -485,7 +485,7 @@ 0x000000710001257c,nullsub_45,4, 0x0000007100012580,_ZNK4sead15RuntimeTypeInfo6DeriveINS_13TaskParameterEE9isDerivedEPKNS0_9InterfaceE,140, 0x000000710001260c,j__ZdlPv_6,4, -0x0000007100012610,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_,468,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_? +0x0000007100012610,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_,468,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_ 0x00000071000127e4,_ZN4sead18Matrix34CalcCommonIfE7inverseERNS_9BaseMtx34IfEERKS3_,336, 0x0000007100012934,j__ZdlPv_7,4, 0x0000007100012938,_ZN4sead19FixedSafeStringBaseIcLi80EEaSERKNS_14SafeStringBaseIcEE,240, @@ -6542,7 +6542,7 @@ 0x000000710011d8d8,AI_Action_EventOpenMessageTips::init,8, 0x000000710011d8e0,AI_Action_EventOpenMessageTips::enter,32, 0x000000710011d900,AI_Action_EventOpenMessageTips::calc,604, -0x000000710011db5c,_ZNK4sead14SafeStringBaseIcE10rfindIndexERKS1_,460,_ZNK4sead14SafeStringBaseIcE10rfindIndexERKS1_? +0x000000710011db5c,_ZNK4sead14SafeStringBaseIcE10rfindIndexERKS1_,460,_ZNK4sead14SafeStringBaseIcE10rfindIndexERKS1_ 0x000000710011dd28,AI_Action_EventOpenMessageTips::leave,4, 0x000000710011dd2c,AI_Action_EventOpenMessageTips::loadParams,164, 0x000000710011ddd0,AI_Action_EventOpenMessageTips::rtti1,288, @@ -62225,8 +62225,8 @@ 0x0000007100b19370,_ZN4sead14DelegateThread5calc_El,32,_ZN4sead14DelegateThread5calc_El 0x0000007100b19390,_ZN4sead13ReadWriteLockC2Ev,84,_ZN4sead13ReadWriteLockC1Ev 0x0000007100b193e4,sead::ReadWriteLock::dtor,40,_ZN4sead13ReadWriteLockD1Ev -0x0000007100b1940c,_ZN4sead13ReadWriteLock8readLockEv,168,_ZN4sead13ReadWriteLock8readLockEv? -0x0000007100b194b4,_ZN4sead13ReadWriteLock10readUnlockEv,64,_ZN4sead13ReadWriteLock10readUnlockEv? +0x0000007100b1940c,_ZN4sead13ReadWriteLock8readLockEv,168,_ZN4sead13ReadWriteLock8readLockEv +0x0000007100b194b4,_ZN4sead13ReadWriteLock10readUnlockEv,64,_ZN4sead13ReadWriteLock10readUnlockEv 0x0000007100b194f4,_ZN4sead13ReadWriteLock9writeLockEv,168,_ZN4sead13ReadWriteLock9writeLockEv 0x0000007100b1959c,_ZN4sead13ReadWriteLock11writeUnlockEv,200,_ZN4sead13ReadWriteLock11writeUnlockEv? 0x0000007100b19664,sead::SpinLock::ctor,12,_ZN4sead8SpinLockC1Ev diff --git a/tools/check.py b/tools/check.py index 9732dcf9..312c97e2 100755 --- a/tools/check.py +++ b/tools/check.py @@ -50,14 +50,10 @@ def check_function(addr: int, size: int, name: str) -> bool: try: base_fn = get_fn_from_base_elf(addr, size) except KeyError: - utils.print_error(f"couldn't find base function 0x{addr:016x} for {name}") + utils.print_error(f"couldn't find base function 0x{addr:016x} for {utils.format_symbol_name_for_msg(name)}") return False - try: - my_fn = get_fn_from_my_elf(name, size) - except KeyError: - utils.warn(f"couldn't find decompiled function {name}") - return True + my_fn = get_fn_from_my_elf(name, size) md = cs.Cs(cs.CS_ARCH_ARM64, cs.CS_MODE_ARM) md.detail = True @@ -133,10 +129,21 @@ def main() -> None: if not func.decomp_name: continue + try: + get_fn_from_my_elf(func.decomp_name, 0) + except KeyError: + utils.warn(f"couldn't find {utils.format_symbol_name_for_msg(func.decomp_name)}") + continue + if func.status == utils.FunctionStatus.Matching: if not check_function(func.addr, func.size, func.decomp_name): - utils.print_error(f"{func.decomp_name} was marked as matching but does not match") + utils.print_error( + f"function {utils.format_symbol_name_for_msg(func.decomp_name)} is marked as matching but does not match") failed = True + elif func.status == utils.FunctionStatus.Equivalent or func.status == utils.FunctionStatus.NonMatching: + if check_function(func.addr, func.size, func.decomp_name): + utils.print_note( + f"function {utils.format_symbol_name_for_msg(func.decomp_name)} is marked as non-matching but matches") if failed: sys.exit(1) diff --git a/tools/utils.py b/tools/utils.py index ab544aab..755618fb 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -60,18 +60,29 @@ def format_symbol_name(name: str) -> str: return name +def format_symbol_name_for_msg(name: str) -> str: + try: + return f"{Fore.BLUE}{cxxfilt.demangle(name)}{Fore.RESET} {Style.DIM}({name}){Style.RESET_ALL}{Style.BRIGHT}" + except: + return name + + def are_demangled_names_equal(name1: str, name2: str): return cxxfilt.demangle(name1) == cxxfilt.demangle(name2) -def warn(msg: str): - sys.stderr.write(f"{Fore.MAGENTA}{Style.BRIGHT}warning:{Fore.RESET} {msg}{Style.RESET_ALL}\n") +def print_note(msg: str, prefix: str = ""): + sys.stderr.write(f"{Style.BRIGHT}{prefix}{Fore.CYAN}note:{Fore.RESET} {msg}{Style.RESET_ALL}\n") -def print_error(msg: str): - sys.stderr.write(f"{Fore.RED}{Style.BRIGHT}error:{Fore.RESET} {msg}{Style.RESET_ALL}\n") +def warn(msg: str, prefix: str = ""): + sys.stderr.write(f"{Style.BRIGHT}{prefix}{Fore.MAGENTA}warning:{Fore.RESET} {msg}{Style.RESET_ALL}\n") -def fail(msg: str): - print_error(msg) +def print_error(msg: str, prefix: str = ""): + sys.stderr.write(f"{Style.BRIGHT}{prefix}{Fore.RED}error:{Fore.RESET} {msg}{Style.RESET_ALL}\n") + + +def fail(msg: str, prefix: str = ""): + print_error(msg, prefix) sys.exit(1)