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.
67 lines
1.6 KiB
67 lines
1.6 KiB
#!/usr/bin/env python3 |
|
# |
|
# Copyright (c) 2021 Intel Corporation |
|
# |
|
# SPDX-License-Identifier: Apache-2.0 |
|
|
|
""" |
|
Utilities for Dictionary-based Logging Parser |
|
""" |
|
|
|
import binascii |
|
|
|
|
|
def convert_hex_file_to_bin(hexfile): |
|
"""This converts a file in hexadecimal to binary""" |
|
bin_data = b'' |
|
|
|
with open(hexfile, "r", encoding="iso-8859-1") as hfile: |
|
for line in hfile.readlines(): |
|
hex_str = line.strip() |
|
|
|
bin_str = binascii.unhexlify(hex_str) |
|
bin_data += bin_str |
|
|
|
return bin_data |
|
|
|
|
|
def extract_one_string_in_section(section, str_ptr): |
|
"""Extract one string in an ELF section""" |
|
data = section['data'] |
|
max_offset = section['size'] |
|
offset = str_ptr - section['start'] |
|
|
|
if offset < 0 or offset >= max_offset: |
|
return None |
|
|
|
ret_str = "" |
|
|
|
while (offset < max_offset) and (data[offset] != 0): |
|
ret_str += chr(data[offset]) |
|
offset += 1 |
|
|
|
return ret_str |
|
|
|
|
|
def find_string_in_mappings(string_mappings, str_ptr): |
|
""" |
|
Find string pointed by string_ptr in the string mapping |
|
list. Return None if not found. |
|
""" |
|
if string_mappings is None: |
|
return None |
|
|
|
if len(string_mappings) == 0: |
|
return None |
|
|
|
if str_ptr in string_mappings: |
|
return string_mappings[str_ptr] |
|
|
|
# No direct match on pointer value. |
|
# This may be a combined string. So check for that. |
|
for ptr, string in string_mappings.items(): |
|
if ptr <= str_ptr < (ptr + len(string)): |
|
whole_str = string_mappings[ptr] |
|
return whole_str[str_ptr - ptr:] |
|
|
|
return None
|
|
|