嗨,这是我的python脚本的片段:
#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个字节的数据,并尝试在struct格式中解压缩。 我面临的问题是,在一个包含100多个符号的大型ELF文件中,我可以成功解读前100个符号的符号信息,但最后几个符号我不能。
如果我查看我的日志,我可以看到read 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 read api是否存在已知问题?
答案 0 :(得分:3)
您已在'r'
模式或文本模式下打开文件。要使file.tell()
提供有用的信息,您必须以'rb'
或二进制模式打开文件。