哪个数据结构用于符号表?

时间:2015-06-06 07:18:57

标签: python

在python程序中,我正在解析一个二进制文件来为它构建符号表。然后,我想将地址与符号相关联。现在我的符号表是Symbol对象的排序列表,它由地址,长度和名称组成,符号查找天真地遍历符号。查找包括查找哪个符号包含给定地址,换句话说:

addr >= symbol.addr and addr < symbol.addr + symbol.length

因为我正在分析的程序变得非常庞大,所以我面临着性能问题,并寻求更高效(在复杂性方面)的解决方案。我查看了bisect包,它是否适合在这种情况下使用?你会如何实现?

2 个答案:

答案 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:
    # ...