2015-06-06 29 views
-1

在python程序中,我解析了一個二進制文件來爲它構建符號表。然後,我想將地址關聯到符號。現在我的符號表是由地址,長度和名稱組成的Symbol對象的排序列表,並且符號查找天真地遍歷符號。查找在於發現其中的符號包含給定的地址,換句話說:哪個數據結構用於符號表?

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

因爲我分析的程序變得非常大,我對着表演的擔憂,並尋找更有效的(在以下方面複雜)解決方案。我看了一下bisect包,這是在這種情況下使用的正確包嗎?你將如何實現?

+0

'bisect'只是二進制搜索,這可能不是,除非你的符號有用表已排序。你在符號表中做什麼樣的查找?你可以使用一個將符號名稱映射到符號對象的字典嗎? – Blender

+0

@Blender我編輯了我的問題來澄清。 –

+0

@Blender no我不能,因爲我的查找包含inf找到哪個符號「包含」一個給定的地址,如編輯的問題所示 –

回答

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