def get_dependants_of(self, lib_name): dependants = set() for root, dirs, files in os.walk(self.app_dir): if 'opt/libc' in root: continue for file in files: abs_path = os.path.join(root, file) try: if is_elf(abs_path): patch_elf = PatchElf() patch_elf.log_stdout = False patch_elf.log_stderr = False patch_elf.log_command = False needs = patch_elf.get_needed(abs_path) if lib_name in needs: dependants.add( os.path.relpath(abs_path, self.app_dir)) except FileNotFoundError: pass except PatchElfError: pass return dependants
def get_bundle_needed_libs(self): libs_needed = set() bundle_libs = set() for root, dirs, files in os.walk(self.app_dir): if 'opt/libc' in root: continue for file in files: bundle_libs.add(file) abs_path = os.path.join(root, file) try: if is_elf(abs_path): patch_elf = PatchElf() patch_elf.log_stdout = False patch_elf.log_stderr = False patch_elf.log_command = False libs_needed.update(patch_elf.get_needed(abs_path)) except FileNotFoundError: pass except PatchElfError: pass bundle_needed = libs_needed - bundle_libs return bundle_needed
def __init__(self, app_dir, app_dir_files): super().__init__(app_dir, app_dir_files) self.priority = 100 self.patch_elf = PatchElf() self.patch_elf.logger.level = logging.WARNING self.system_interpreter = None
def _set_interpreter(self, file, interpreter): try: patchelf_command = PatchElf() patchelf_command.log_stderr = False bin_interpreter = patchelf_command.get_interpreter(file) if bin_interpreter: self.system_interpreter = bin_interpreter logging.info('Setting interpreter to: %s' % os.path.relpath(file, self.app_dir)) patchelf_command.set_interpreter(file, interpreter) except PatchElfError: pass
def _set_interpreter(self, file, uuid): try: patchelf_command = PatchElf() patchelf_command.log_stderr = False real_interpreter = patchelf_command.get_interpreter(file) if real_interpreter.startswith('/tmp/appimage-'): # skip, the binary has been patched already return apprun_interpreter = self._gen_interpreter_link_path( real_interpreter, uuid) if real_interpreter and real_interpreter != apprun_interpreter: self.interpreters[real_interpreter] = apprun_interpreter logging.info('Replacing PT_INTERP on: %s' % os.path.relpath(file, self.app_dir)) logging.info('\t"%s" => "%s"' % (real_interpreter, apprun_interpreter)) patchelf_command.set_interpreter(file, apprun_interpreter) except PatchElfError: pass