You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
2.0 KiB
51 lines
2.0 KiB
#-------------------------------------------------------------------------------
|
|
# elftools: elf/notes.py
|
|
#
|
|
# ELF notes
|
|
#
|
|
# Eli Bendersky (eliben@gmail.com)
|
|
# This code is in the public domain
|
|
#-------------------------------------------------------------------------------
|
|
from ..common.py3compat import bytes2str
|
|
from ..common.utils import struct_parse, roundup
|
|
from ..construct import CString
|
|
|
|
|
|
def iter_notes(elffile, offset, size):
|
|
""" Yield all the notes in a section or segment.
|
|
"""
|
|
end = offset + size
|
|
while offset < end:
|
|
note = struct_parse(
|
|
elffile.structs.Elf_Nhdr,
|
|
elffile.stream,
|
|
stream_pos=offset)
|
|
note['n_offset'] = offset
|
|
offset += elffile.structs.Elf_Nhdr.sizeof()
|
|
elffile.stream.seek(offset)
|
|
# n_namesz is 4-byte aligned.
|
|
disk_namesz = roundup(note['n_namesz'], 2)
|
|
note['n_name'] = bytes2str(
|
|
CString('').parse(elffile.stream.read(disk_namesz)))
|
|
offset += disk_namesz
|
|
|
|
desc_data = bytes2str(elffile.stream.read(note['n_descsz']))
|
|
if note['n_type'] == 'NT_GNU_ABI_TAG':
|
|
note['n_desc'] = struct_parse(elffile.structs.Elf_abi,
|
|
elffile.stream,
|
|
offset)
|
|
elif note['n_type'] == 'NT_GNU_BUILD_ID':
|
|
note['n_desc'] = ''.join('%.2x' % ord(b) for b in desc_data)
|
|
elif note['n_type'] == 'NT_PRPSINFO':
|
|
note['n_desc'] = struct_parse(elffile.structs.Elf_Prpsinfo,
|
|
elffile.stream,
|
|
offset)
|
|
elif note['n_type'] == 'NT_FILE':
|
|
note['n_desc'] = struct_parse(elffile.structs.Elf_Nt_File,
|
|
elffile.stream,
|
|
offset)
|
|
else:
|
|
note['n_desc'] = desc_data
|
|
offset += roundup(note['n_descsz'], 2)
|
|
note['n_size'] = offset - note['n_offset']
|
|
yield note
|
|
|