Browse Source

tools: fix idf_monitor.py not working on macOS for Linux target

Since the introduction of PCAddressMatcher, the executable produced
by the build system is passed to elftools.elf.elffile.ELFFile.
However on macOS, native executables are not ELF files, so the
ELFFile class raises a rather unhelpful AssertionError exception.
Given that the rest of the idf_monitor.py doesn't have assumptions
that the "elf_file" argument is an ELF file (rather than just an
executable), check if the file is a real ELF file inside
PCAddressMatcher.
Ivan Grokhotkov 3 years ago
parent
commit
98d1f7de4b
1 changed files with 13 additions and 3 deletions
  1. 13 3
      tools/idf_monitor_base/pc_address_matcher.py

+ 13 - 3
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: