def _run_patchelf(self, *, patchelf_args: List[str], elf_file_path: str) -> None: # Run patchelf on a copy of the primed file and replace it # after it is successful. This allows us to break the potential # hard link created when migrating the file across the steps of # the part. with tempfile.NamedTemporaryFile() as temp_file: shutil.copy2(elf_file_path, temp_file.name) cmd = [self._patchelf_cmd] + patchelf_args + [temp_file.name] try: subprocess.check_call(cmd) # There is no need to catch FileNotFoundError as patchelf should be # bundled with snapcraft which means its lack of existence is a # "packager" error. except subprocess.CalledProcessError as call_error: patchelf_version = subprocess.check_output( [self._patchelf_cmd, '--version']).decode().strip() # 0.10 is the version where patching certain binaries will # work (currently known affected packages are mostly built # with go). if parse_version(patchelf_version) < parse_version('0.10'): raise errors.PatcherNewerPatchelfError( elf_file=elf_file_path, process_exception=call_error, patchelf_version=patchelf_version) else: raise errors.PatcherGenericError( elf_file=elf_file_path, process_exception=call_error) # We unlink to break the potential hard link os.unlink(elf_file_path) shutil.copy2(temp_file.name, elf_file_path)
def _run_patchelf(self, *, patchelf_args: List[str], elf_file_path: str) -> None: # Run patchelf on a copy of the primed file and replace it # after it is successful. This allows us to break the potential # hard link created when migrating the file across the steps of # the part. with tempfile.NamedTemporaryFile() as temp_file: shutil.copy2(elf_file_path, temp_file.name) cmd = [self._patchelf_cmd] + patchelf_args + [temp_file.name] try: subprocess.check_call(cmd) # There is no need to catch FileNotFoundError as patchelf should be # bundled with snapcraft which means its lack of existence is a # "packager" error. except subprocess.CalledProcessError as call_error: raise errors.PatcherGenericError(elf_file=elf_file_path, process_exception=call_error) # We unlink to break the potential hard link os.unlink(elf_file_path) shutil.copy2(temp_file.name, elf_file_path)