Building android kernel

790 Views Asked by At

since two weeks I try to build the kernel for my htc device. Getting the right sources is not the problem, but since gcc has been removed from toolchains it's a real nightmare. Following the proposals to use clang instead always ends in lot of error messages.

What I've done up to now?

  1. Proper installation of latest android-ndk (21.3.6528147)
  2. Successfully test cross-compiling (just a simple program) over commandline
  3. setup ENV variables for kernel build: (export commands only if not set yet)
$ cd <kernel-source-root>
($ make mrproper) // just after failed attempt to build
$ export ARCH=arm64
$ export SUBARCH=arm64
$ export CROSS_COMPILE=<path-to-toolchain-llvm-bin-folder>
  1. modify Makefile and AndroidKernel.mk
// replace all occurences of 'gcc' with 'clang'
-gcc 
+clang
  1. generate .config
$ make msm-perf_defconfig
  1. perform build
$ make V=1
  1. getting error messages:
// ...
../kernel/bounds.c:18:2: error: unexpected token at start of statement
        DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
        ^
../include/linux/kbuild.h:5:25: note: expanded from macro 'DEFINE'
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
                        ^
<inline asm>:2:1: note: instantiated into assembly here
->NR_PAGEFLAGS 21 __NR_PAGEFLAGS
^
../kernel/bounds.c:19:2: error: unexpected token at start of statement
        DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);
        ^
../include/linux/kbuild.h:5:25: note: expanded from macro 'DEFINE'
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
                        ^
<inline asm>:2:1: note: instantiated into assembly here
->MAX_NR_ZONES 3 __MAX_NR_ZONES
^
../kernel/bounds.c:21:2: error: unexpected token at start of statement
        DEFINE(NR_CPUS_BITS, ilog2(CONFIG_NR_CPUS));
        ^
../include/linux/kbuild.h:5:25: note: expanded from macro 'DEFINE'
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
                        ^
<inline asm>:2:1: note: instantiated into assembly here
->NR_CPUS_BITS 3 ilog2(CONFIG_NR_CPUS)
^
../kernel/bounds.c:23:2: error: unexpected token at start of statement
        DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t));
        ^
../include/linux/kbuild.h:5:25: note: expanded from macro 'DEFINE'
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
                        ^
<inline asm>:2:1: note: instantiated into assembly here
->SPINLOCK_SIZE 4 sizeof(spinlock_t)
^
4 errors generated.
make[2]: *** [kernel/bounds.s] Error 1
make[1]: *** [prepare0] Error 2
make: *** [sub-make] Error 2

Does someone see what goes wrong?

1

There are 1 best solutions below

0
On

Adding -no-integrated-as to the build command fixed it.

According to clang developers:

Add -no-integrated-as. This is a known abuse of the compiler to output something other than assembly.

reference

make ARCH=arm64 -j64 -no-integrated-as