Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Linux의 “cannot execute binary file: Exec format error” — 파일·플랫폼·인터프리터 경계를 증명하라

정확한 바이트를 보존하고 파일 종류를 분류한 뒤 호스트의 머신 형식과 선언된 인터프리터를 확인하고 나서 재빌드나 권한 변경을 결정합니다.

정확한 파일을 형식, 호스트 플랫폼, 인터프리터 검사로 추적하는 원본 도식.
원본 개념 일러스트: 정확한 바이트를 먼저 분류한 뒤 수정을 선택한다. Watch at Ease

“Exec format error”는 형식 분류 실패이지 실행 비트가 틀렸다는 증거가 아닙니다. 변경 전에 정확한 명령, 경로, 작업 디렉터리, 셸, 호스트 아키텍처와 파일 SHA-256을 보존하십시오. 그런 다음 바이트가 스크립트, ELF 실행 파일, 오브젝트, 아카이브인지, 아니면 바이너리 이름으로 저장된 오류 페이지인지 읽기 전용으로 분류합니다.

이 절차는 호스트 셸에서 직접 실행할 때만 적용합니다. systemd 유닛이나 Docker 빌드·엔트리포인트에서 실패했다면 같은 증거를 보존한 뒤 전용 안내서로 넘기십시오. 서비스 관리자와 컨테이너에서는 실제 경로, 플랫폼, 인터프리터 경계가 달라집니다.

한 번의 실패를 고정하고 정확한 바이트를 확인한다

명령 그대로, 종료 상태, 절대 경로, 작업 디렉터리, 셸, uname -s, uname -m, 대상 sha256sum을 기록합니다. 파일을 바꾸지 않고 심볼릭 링크를 해석하고 래퍼가 다른 경로를 골랐는지 확인합니다.

정확한 경로에 file을 실행해 전체 출력을 저장합니다. HTML, JSON, 텍스트, 아카이브, 재배치 오브젝트나 데이터라면 권한을 바꾸기 전에 다운로드 또는 빌드 산출물을 조사합니다.

스크립트와 ELF 바이너리를 분리한다

스크립트는 첫 줄의 원시 바이트만 확인해 #!, 절대 인터프리터 경로, 캐리지 리턴이나 BOM이 커널이 보는 경로를 바꾸지 않았는지 점검합니다. 전체 스크립트를 먼저 다시 쓰지 말고 인터프리터를 별도로 읽기 전용 확인합니다.

ELF에는 readelf -h를 실행하고 Class, Data, Type, Machine을 대상 호스트와 비교합니다. 여기서 불일치하면 chmod가 아니라 생산 빌드나 릴리스 산출물 선택 문제입니다.

ELF 인터프리터 경계를 증명한다

ELF 헤더가 맞으면 readelf -l로 요청된 프로그램 인터프리터를 확인하고 정확한 경로와 예상 로더가 호스트에 있는지 검증합니다. CPU 표기가 맞는 것만으로 ABI와 로더 존재가 증명되지는 않습니다.

이름이 비슷한 임의 파일을 복사해 로더를 “수정”하지 마십시오. 지원되는 ABI용 산출물을 선택하거나 통제된 패키지 절차로 문서화된 런타임을 설치합니다.

증상이 아니라 생산 경계를 고친다

OS나 머신이 틀리면 올바른 대상을 선택하거나 재빌드하고, ELF 유형이 틀리면 오브젝트나 라이브러리 대신 실행 파일을 배포합니다. 텍스트라면 다운로드·인증·리디렉션·패키징을 고치고, 스크립트 헤더 문제는 그 경계만 수정·검토합니다.

사고 기록에 원래 해시와 교체 해시를 함께 남깁니다. 빌드, 배포, 업데이터가 경로를 만든다면 다음 실행에서 잘못된 바이트가 되살아나지 않도록 생산자를 고칩니다.

같은 호출을 반복하고 종료 조건을 정한다

같은 대상 호스트와 작업 디렉터리에서 같은 명령을 실행하고 교체 해시, 파일 분류, 관련 ELF 또는 shebang 증거, 종료 상태, 작은 예상 동작 검사를 기록합니다.

대상에서 실행이 성공하고 이전의 모든 불일치가 설명됐을 때만 닫습니다. systemd나 Docker가 문맥을 제공했다면 증거를 전용 절차로 넘기고 서로 다른 실행 경계를 섞지 않습니다.

스크립트, 플랫폼, ELF 유형, 컨테이너 인계 분기를 나눈 원본 결정 도식.
원본 개념 일러스트: 첫 실패 경계를 고치고 같은 호출을 반복한다. Watch at Ease