0

嗨,这是我的 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 字节的数据,并尝试将其解压缩为结构格式。我面临的问题是,在一个包含 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 字节的跳跃。知道为什么 read 的行为如此奇怪吗?python read api是否存在已知问题?

4

1 回答 1

3

您已以'r'模式或文本模式打开文件。为了提供有用的信息,您必须以二进制模式file.tell()打开文件。'rb'

于 2013-10-22T21:38:24.370 回答