在python程序中,我正在解析一个二进制文件来为它构建符号表。然后,我想将地址与符号相关联。现在我的符号表是Symbol
对象的排序列表,它由地址,长度和名称组成,符号查找天真地遍历符号。查找包括查找哪个符号包含给定地址,换句话说:
addr >= symbol.addr and addr < symbol.addr + symbol.length
因为我正在分析的程序变得非常庞大,所以我面临着性能问题,并寻求更高效(在复杂性方面)的解决方案。我查看了bisect
包,它是否适合在这种情况下使用?你会如何实现?
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以通过二进制搜索从左侧找到最近的地址来加速查找:
import bisect
addr_to_sym = {sym.addr: sym for sym in symbols}
symbol_addrs = sorted(sym.addr for sym in symbols)
addr = bisect.bisect_left(symbol_addrs, 0xABCDEF)
sym = addr_to_sym[addr]
if addr <= 0xABCDEF <= addr + sym.length:
# ...