안드로이드 커널 컴파일 시 올바른 툴체인 사용하기

!
경고: 이 글이 작성된 지 365일이 넘었습니다. 글의 정보가 오래되어 부정확할 수 있습니다.

안드로이드 커널을 소스에서 컴파일할 때 다음과 같은 오류가 발생했습니다:

  LD      drivers/net/built-in.o
  LD      drivers/usb/gadget/g_android.o
  LD      drivers/usb/gadget/built-in.o
  LD      drivers/usb/built-in.o
  LD      drivers/built-in.o
  LD      vmlinux.o
  MODPOST vmlinux.o
ERROR: modpost: Found 13 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
To build the kernel despite the mismatches, build with:
'make CONFIG_NO_ERROR_ON_MISMATCH=y'
(NOTE: This is not recommended)
/home/users/ideaman924/android_kernel_samsung_msm8974/scripts/Makefile.modpost:98: recipe for target 'vmlinux.o' failed
make[1]: *** [vmlinux.o] Error 1
Makefile:947: recipe for target 'vmlinux.o' failed
make: *** [vmlinux.o] Error 2
ideaman924@build:~/android_kernel_samsung_msm8974$

이상하게도 다른 defconfig이나 커널 소스를 교체해도 다 똑같이 이상한 modpost section mismatch 에러가 발생했습니다. 왜 이렇게 문제가 발생하는지 검색하면서 다음 Stack Overflow 글들을 확인했지만 별로 도움이 되진 않았습니다:

근데, 이 커널 소스는 LineageOS에서 사용하는 커널 소스라, 설마 LineageOS가 잘못된 코드를 배포하진 않을거라 생각해서 다른 해결방안을 찾아봤습니다.

문제는 코드가 아니라 툴체인이였는데, 텔레그램상의 리눅스 커널 채팅방에서 @mochi_wwww라는 유저가 제가 잘못된 툴체인을 사용하고 있다는 점을 알려줬습니다. 제가 사용하던 툴체인은 몇 년 동안 방치되어 있던 툴체인이였습니다.

사실 이게 헷갈렸던 이유는, 레퍼런스 안드로이드 커널 컴파일 가이드가 그 오래된 툴체인에 링크하기에 그 툴체인을 써도 괜찮은 줄 알았습니다. 제대로 된 툴체인을 사용하니 바로 문제가 해결됐습니다.

그러니 만약 위에 나온 에러가 커널 컴파일 중 발생한다면, 저처럼 괜히 고생하면서 시간 낭비하시지 마시고, 커널에 알맞는 툴체인을 사용해서 컴파일을 해 보세요. LineageOS에서 나온 커널 소스라면 AndroidKernel.mk 파일에 대부분 툴체인 정보가 나와 있습니다.

댓글