2013-10-22 96 views
0

你好這裏是我的Python腳本片段:的Python閱讀()API異常

#seek to the symtab_offset  
elf_fp.seek(self.symtab_sh.sh_offset) 

#each entry is 16 bytes, so num_entries = size/16 
num_entries = self.symtab_sh.sh_size/16 
symbol_list = [] 
counter = 0 
prev=0 
for _ in range(num_entries): 
    counter+=1 
    s = struct.Struct('IIIccH') 
    prev = elf_fp.tell() 
    print str(counter) +" " +str(elf_fp.tell()) +"/" + str(hex(elf_fp.tell())), 
    buffer = elf_fp.read(16) 
    print " diff: " +str(elf_fp.tell() - prev) 
    if len(buffer) !=16: 
     continue 
    unpacked_data = s.unpack(buffer) 
    name   = unpacked_data[0] 
    value   = unpacked_data[1] 
    size   = unpacked_data[2] 
    types   = unpacked_data[3] 
    #print str(size) +"," +str(types.encode('hex')) 
    #only add none zero size entries 
    if size and name: 
     symbol_list.append({"name":name,"value":value, "size": size, "type": types}) 

這個片斷是從與ELF文件的符號表中讀取16個字節的數據,並試圖以一個結構格式中解壓。 我面臨的問題是,在一個超過100多個符號的大ELF文件中,我可以成功破譯前100個符號的符號信息,但最後幾個我不能。

如果我看看我的日誌,我可以看到讀取api的行爲很奇怪。從文件讀取16個字節後,它應該將文件指針增加16個字節。相反,我可以看到它在某些地方被一些奇怪的偏移遞增。

這裏是日誌片段:

107 36056/0x8cd8L diff: 16 
108 36072/0x8ce8L diff: 16 
109 36088/0x8cf8L diff: 16 
110 36104/0x8d08L diff: 2864 
111 38968/0x9838L diff: 16 

你可以看到,第110符號的讀取造成大約2864字節的跳躍。 任何想法爲什麼閱讀行爲這很奇怪?有沒有知道python讀取api的問題?

+3

如何創建'elf_fp'?你是否將''r''或''rb''傳遞給'open()'調用?後者是此用途所必需的。 –

+0

謝謝老兄。這是問題所在。我在「r」模式下打開它。 –

+0

不客氣。我已經創建了一個答案,如果你關心接受它。 –

回答

3

您已打開文件'r'模式或文本模式。爲了使file.tell()提供有用的信息,您必須打開'rb'二進制文件模式。