asm/types.h: No such file or directory 문제 (Yocto pseudo-native)

Yocto 빌드 중 pseudo-nativedo_compile 단계에서 이런 에러를 만날 때가 있다.

gcc -c -isystem .../recipe-sysroot-native/usr/include -isystem .../recipe-sysroot-native/usr/include -m32 ... pseudo_util.c
In file included from /usr/include/linux/stat.h:5,
                 from /usr/include/bits/statx.h:31,
                 from /usr/include/sys/stat.h:465,
                 from pseudo_util.c:29:
/usr/include/linux/types.h:5:10: fatal error: asm/types.h: No such file or directory
    5 | #include <asm/types.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:130: pseudo_util.o] Error 1

recipe-sysroot-native-isystem으로 찍혀 있어 sysroot 문제로 보이지만, 실제로 실패한 include는 /usr/include/...(호스트 경로)다. 원인과 해결법을 정리한다.

원인

pseudo-native는 64비트 호스트에서도 32비트 타깃을 다룰 수 있도록 libpseudo.so를 64비트와 32비트로 각각 빌드한다. 이 32비트 빌드(pseudo_util.c 등)는 recipe-sysroot가 아니라 호스트의 기본 include 경로를 그대로 쓰기 때문에, 호스트에 32비트 커널 헤더(asm/types.h)가 없으면 이 에러가 난다.

해결책

32비트 개발 패키지를 설치한 뒤 pseudo-native를 sstate 없이 다시 빌드하면 된다.

$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6-dev-i386

$ bitbake -c cleansstate pseudo-native
$ bitbake pseudo-native

Yocto 공식 문서의 Ubuntu 빌드 호스트 필수 패키지 목록에도 gcc-multilib이 포함돼 있으니, 처음부터 이 패키지들을 설치해뒀다면 애초에 겪지 않았을 문제다.

호스트 패키지를 설치할 수 없는 환경(CI 컨테이너 등)이라면 conf/local.conf에 아래 한 줄을 추가해 32비트 빌드 자체를 건너뛸 수 있다.

NO32LIBS = "1"

단 이 옵션은 32비트 타깃 바이너리를 실제로 다루는 빌드에서는 쓰면 안 된다.

실습: 최소 재현

poky 전체를 빌드하지 않아도 같은 증상을 재현할 수 있다. Ubuntu 24.04에서 직접 확인했다.

$ gcc -m32 -c mtest.c -o mtest.o   # asm/types.h만 include한 최소 재현
mtest.c:1:10: fatal error: asm/types.h: No such file or directory

$ sudo dpkg --add-architecture i386
$ sudo apt-get update -qq
$ sudo apt-get install -y libc6-dev-i386   # gcc-multilib이 의존성으로 함께 설치됨

$ ls -la /usr/include/asm
lrwxrwxrwx 1 root root 20 ... /usr/include/asm -> x86_64-linux-gnu/asm
$ dpkg -S /usr/include/asm
gcc-multilib: /usr/include/asm

$ gcc -m32 -c mtest.c -o mtest.o
$ echo exit=$?
exit=0

gcc-multilib/usr/include/asm 심볼릭 링크를 만들어주면서 해결된다.

주의사항

  • 에러 로그의 -isystem recipe-sysroot-native에 현혹되지 말 것 — fatal error 줄이 plain /usr/include/...면 호스트 멀티립 문제다.
  • 패키지 이름은 배포판마다 다르다(RHEL/Fedora는 glibc-devel.i686 등).

참고

답글 남기기