#android #macos #toolchain #android-kernel
#Android #macos #набор инструментов #android-ядро
Вопрос:
уже две недели я пытаюсь собрать ядро для своего устройства htc. Получение правильных исходных текстов не является проблемой, но поскольку gcc был удален из toolchains, это настоящий кошмар. Следование предложениям использовать clang вместо этого всегда заканчивается множеством сообщений об ошибках.
Что я делал до сих пор?
- Правильная установка последней версии android-ndk (21.3.6528147)
- Успешно протестируйте кросс-компиляцию (просто простую программу) через командную строку
- настройка переменных ENV для сборки ядра: (команды экспорта только в том случае, если они еще не установлены)
$ 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>
- измените Makefile и AndroidKernel.mk
// replace all occurences of 'gcc' with 'clang'
-gcc
clang
- сгенерировать .config
$ make msm-perf_defconfig
- выполнить сборку
$ make V=1
- получение сообщений об ошибках:
// ...
../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
Кто-нибудь видит, что идет не так?
Комментарии:
1. Та же ошибка, вы нашли, что не так @Sergio?
Ответ №1:
Добавление -no-integrated-as
в команду сборки исправило это.
По словам разработчиков clang:
Добавить -не-интегрировано-как. Это известное злоупотребление компилятором для вывода чего-то другого, кроме сборки.
make ARCH=arm64 -j64 -no-integrated-as