docs: def _executable_memory_regions(self, objects=None, force_segment=False):
          """
          Get all executable memory regions from the binaries
  
          :param objects: A collection of binary objects to collect regions from. If None, regions from all project
                          binary objects are used.
          :param bool force_segment: Rely on binary segments instead of sections.
          :return: A sorted list of tuples (beginning_address, end_address)
          """
  
          if objects is None:
              binaries = self.project.loader.all_objects
          else:
              binaries = objects
  
          memory_regions = [ ]
  
          for b in binaries:
              if isinstance(b, ELF):
                  # If we have sections, we get result from sections
                  if not force_segment and b.sections:
                      # Get all executable sections
                      for section in b.sections:
                          if section.is_executable:
                              tpl = (section.min_addr, section.max_addr)
                              memory_regions.append(tpl)
  
                  else:
                      # Get all executable segments
                      for segment in b.segments:
                          if segment.is_executable:
                              tpl = (segment.min_addr, segment.max_addr)
                              memory_regions.append(tpl)
  
              elif isinstance(b, PE):
                  for section in b.sections:
                      if section.is_executable:
                          tpl = (section.min_addr, section.max_addr)
                          memory_regions.append(tpl)
  
              elif isinstance(b, MachO):
                  if b.segments:
                      # Get all executable segments
                      for seg in b.segments:
                          if seg.is_executable:
                              # Take all sections from this segment (MachO style)
                              for section in seg.sections:
                                  tpl = (section.min_addr, section.max_addr)
                                  memory_regions.append(tpl)
  
              elif isinstance(b, Blob):
                  # a blob is entirely executable
                  tpl = (b.min_addr, b.max_addr)
                  memory_regions.append(tpl)
  
              elif isinstance(b, self._cle_pseudo_objects):
                  pass
  
              else:
                  l.warning('Unsupported object format "%s". Treat it as an executable.', b.__class__.__name__)
  
                  tpl = (b.min_addr, b.max_addr)
                  memory_regions.append(tpl)
  
          if not memory_regions:
              memory_regions = [(start, start + len(backer)) for start, backer in self.project.loader.memory.backers()]
  
          memory_regions = sorted(memory_regions, key=lambda x: x[0])
  
          return memory_regions