Linux 사용자 공간 · GCC · Autoconf

빌드하는 컴퓨터와 실행할 컴퓨터를 구분합니다

64비트 여부, 컴파일러, 개발 헤더, sysroot를 확인하는 순서입니다.

서로 다른 세 가지 정보를 확인합니다

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-gnu

Autoconf에서 build는 빌드를 수행하는 시스템이고 host는 만들어진 프로그램을 실행할 시스템입니다. target은 주로 컴파일러 같은 도구를 만들 때 그 도구가 생성할 코드의 대상을 뜻합니다. 모든 configure가 같은 옵션을 받는 것은 아니므로 프로젝트의 --help도 확인합니다.

교차 빌드에서 파일이 쓰이는 위치
  1. 호스트 도구make, Python, makeinfo처럼 빌드 컴퓨터에서 실행합니다.
  2. 타깃 헤더와 라이브러리sysroot 안에서 대상 ABI에 맞는 선언과 라이브러리를 찾습니다.
  3. 결과 파일타깃의 로더와 실행 라이브러리가 읽습니다.

세 상자는 파일의 역할을 구분합니다. 타깃 라이브러리를 호스트의 /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 릴리스의 패키지 정의를 확인합니다. 라이브러리는 이름만 맞는다고 호환되지 않습니다.

확인한 문서

Linux 사용자 공간 · GCC · Autoconf