서로 다른 세 가지 정보를 확인합니다
uname -m
getconf LONG_BIT
file ./program
readelf -h ./program
readelf -l ./program| 확인 항목 | 뜻 |
|---|---|
| uname -m | 실행 환경이 보고하는 머신 종류입니다. 바이너리 하나의 ABI를 판정하는 명령은 아닙니다. |
| getconf LONG_BIT | 이 getconf 프로그램이 사용하는 long의 비트 수입니다. 64비트 커널에서도 32비트 사용자 공간을 실행할 수 있습니다. |
| ELF Class / Machine | 검사 중인 파일의 형식과 대상 아키텍처입니다. |
| INTERP | 동적 실행 파일이 요구하는 로더 경로입니다. 파일이 있어도 이 로더가 없으면 실행이 실패할 수 있습니다. |
실행 파일이 보이는데 No such file or directory가 나온다면 ELF 인터프리터나 스크립트의 shebang도 확인합니다. 반대로 모든 실행 실패를 32/64비트 문제로 단정하지는 않습니다.
컴파일러와 라이브러리의 대상을 맞춥니다
aarch64-linux-gnu-gcc -dumpmachine
aarch64-linux-gnu-gcc --print-sysroot
./configure --build="$(./config.guess)" --host=aarch64-linux-gnuAutoconf에서 build는 빌드를 수행하는 시스템이고 host는 만들어진 프로그램을 실행할 시스템입니다. target은 주로 컴파일러 같은 도구를 만들 때 그 도구가 생성할 코드의 대상을 뜻합니다. 모든 configure가 같은 옵션을 받는 것은 아니므로 프로젝트의 --help도 확인합니다.
- 호스트 도구make, Python, makeinfo처럼 빌드 컴퓨터에서 실행합니다.
- 타깃 헤더와 라이브러리sysroot 안에서 대상 ABI에 맞는 선언과 라이브러리를 찾습니다.
- 결과 파일타깃의 로더와 실행 라이브러리가 읽습니다.
세 상자는 파일의 역할을 구분합니다. 타깃 라이브러리를 호스트의 /usr/lib에 덮어쓰는 순서가 아닙니다.
첫 오류와 config.log를 읽습니다
no termcap library found는 configure가 어떤 헤더·라이브러리로 링크를 시험했는지 확인해야 합니다. 실행 라이브러리만 있고 개발 헤더나 링크용 파일이 없을 수 있습니다. Debian 계열의 -dev, 다른 배포판의 -devel이라는 이름도 배포판과 릴리스에 따라 다릅니다.
makeinfo: command not found라면 보통 호스트의 Texinfo 도구를 찾는 단계입니다. 이때 타깃용 라이브러리를 복사해도 해결되지 않습니다. sudo는 환경을 정리할 수 있으므로 configure를 불필요하게 관리자 권한으로 실행하지 않습니다. 설치 경로는 프로젝트의 DESTDIR 또는 지정한 staging 디렉터리를 사용해 구분합니다.
오래된 Qt PPA나 라이브러리 버전 문자열을 그대로 재사용하기보다 사용 중인 배포판과 Buildroot/Yocto 릴리스의 패키지 정의를 확인합니다. 라이브러리는 이름만 맞는다고 호환되지 않습니다.