|
@@ -4,6 +4,7 @@
|
|
|
|
|
|
|
|
|
import collections
|
|
|
+import dataclasses
|
|
|
import itertools
|
|
|
import operator
|
|
|
import typing
|
|
@@ -105,10 +106,12 @@ def get_vtables_from_address(bin: "LinuxBinary", vt: Symbol) -> list[VTable]:
|
|
|
vtda = bin.vtable_disambiguator
|
|
|
|
|
|
|
|
|
- class VTableFunction(typing.NamedTuple):
|
|
|
+ @dataclasses.dataclass
|
|
|
+ class VTableFunction:
|
|
|
tblidx: int
|
|
|
possible_syms: set[Symbol]
|
|
|
|
|
|
+ disambiguated_functions = set()
|
|
|
function_list: list[VTableFunction] = []
|
|
|
vptr_lists = vtda.get_vfptrs_from_table(vt)
|
|
|
for table_index, vptrs in enumerate(vptr_lists):
|
|
@@ -141,9 +144,11 @@ def get_vtables_from_address(bin: "LinuxBinary", vt: Symbol) -> list[VTable]:
|
|
|
break
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
if matched_overload:
|
|
|
+
|
|
|
+
|
|
|
+ disambiguated_functions.add(matched_overload)
|
|
|
function_list.append(VTableFunction(table_index, {matched_overload}))
|
|
|
continue
|
|
|
|
|
@@ -157,10 +162,15 @@ def get_vtables_from_address(bin: "LinuxBinary", vt: Symbol) -> list[VTable]:
|
|
|
elif len(vfn.possible_syms) == 1:
|
|
|
continue
|
|
|
|
|
|
+ remaining_syms = vfn.possible_syms - disambiguated_functions
|
|
|
+ if len(remaining_syms) == 1:
|
|
|
+ vfn.possible_syms = remaining_syms
|
|
|
+ continue
|
|
|
+
|
|
|
|
|
|
|
|
|
vt_name = demangler.parse(vt.name)
|
|
|
- candidate_names = set(sym.name for sym in vfn.possible_syms)
|
|
|
+ candidate_names = set(sym.name for sym in remaining_syms)
|
|
|
raise Exception(f"Ambiguity in {vt_name} position {n}; candidates {candidate_names}")
|
|
|
|
|
|
return [
|