Yocto 빌드 중 pseudo-native의 do_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등).