diff --git a/tools/idf_monitor_base/pc_address_matcher.py b/tools/idf_monitor_base/pc_address_matcher.py index 9a97e29483..c0c69dc911 100644 --- a/tools/idf_monitor_base/pc_address_matcher.py +++ b/tools/idf_monitor_base/pc_address_matcher.py @@ -7,8 +7,8 @@ from elftools.elf.elffile import ELFFile class PcAddressMatcher(object): """ - Class for detecting potentional addresses which will consequently run through the external addr2line command to - indentify and print information about it. + Class for detecting potential addresses which will consequently run through the external addr2line command to + identify and print information about it. The input to this class is the path to the ELF file. Addresses of sections with executable flag are stored and used later for lookup. @@ -18,6 +18,14 @@ class PcAddressMatcher(object): self.intervals = [] try: with open(elf_path, 'rb') as f: + # Is this an ELF file? + elf_magic = f.read(4) + if elf_magic != b'\x7fELF': + # Probably not an ELF file + # (could be Mach-O format on macOS, for example) + raise NotImplementedError() + f.seek(0) + elf = ELFFile(f) for section in elf.iter_sections(): @@ -30,13 +38,15 @@ class PcAddressMatcher(object): except FileNotFoundError: # ELF file is just an optional argument pass + except NotImplementedError: + pass # sort them in order to have faster lookup self.intervals = sorted(self.intervals) def is_executable_address(self, addr): # type: (int) -> bool """ - Returns True/False depending on of "addr" is in one of the ELF sections with executable flag set. + Returns True/False if "addr" is in one of the ELF sections with executable flag set. """ for start, end in self.intervals: