Миграция из Build root 2015.08.03 с G CC 4.9.3 / Make 3.81 / gblib c 2.20 в настройку Build root 2020.02 для поддержки G CC> 8.x / Make 4.1 / glib c 2.30.
Обнаружена проблема с компилятором G CC 8.3 при сборке ядра Linux 3.14.17 ARM Cortex-A9. Используя G CC 7.5, файл, о котором идет речь, собирается (другие проблемы отладки). Также хорошо работает с компилятором G CC 4.9.3. Подробности ниже - больше может быть предоставлено. Кажется, проблема с промежуточным поколением G CC, в результате чего ASM генерирует неправильный код ?? Кто-нибудь сталкивался с этим?
Пробовал разные варианты сборки ядра, без изменений.
Спасибо за ваш опыт и мудрость. Стивен Беквит
Хост-система: установка VMWare Fusion на MA C OSX Mojave (10.14.6) на винтажном 15-дюймовом Macbook Pro с процессором Core i7, 16 ГБ ОЗУ, 512 ГБ SSD.
ВМ получает 4 ядра (с поддержкой HT) и 8 ГБ источников памяти, расположенных на внешнем жестком диске USB-3, с которого загружается виртуальная машина и находится ее файловая система. ВМ - Ubuntu 18.04.01 - обновлено в середине марта
sbeckwit@ubuntu:~$ uname -a
Linux ubuntu 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
sbeckwit@ubuntu:~$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sbeckwit@ubuntu:/lib32$ ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
Настройка: Наша предыдущая установка - это установка Build root 2015.08.03. Используя оригинальную настройку Build root - мы используем встроенный компилятор Build root, версия 4.9.3, glib c 2.20, Make 3.81. - Эта система создает нашу установку Embedded Linux, включая kernel / uboot / busybox / utilites / apps.
- В этой настройке все собирается просто отлично. - Эта система работает в серверной среде на более старой системе на основе RHEL 5.x.
Ядро Linux, которое мы создаем, - это ядро 3.14.17, с некоторыми сторонними патчами для спецификаций c SO C (EMULEX PIlot4 BM C, теперь принадлежит ASPEED - это двухъядерный ARM Cortex-A9 ARM, так что C) - параметры сборки являются «стандартными», за исключением добавления флага -save-temps чтобы получить выходные файлы .s.
Новая установка: Мы переходим на более новую установку Build root, чтобы уменьшить недавние проблемы CVE, связанные с GLIB C и G CC. Поэтому мы создали новую сборку root setup: Build root 2020.02: - Это поддерживает сборку следующего: G CC 7.5, G CC 8.3, G CC 9.2 Glib c 2.30 ( тот, который мы выбрали сейчас) Использует Make 4.1
Изначально мы создали компилятор G CC 9.2 и столкнулись со следующей ошибкой:
/tmp/ccxaGNai.s: Assembler messages:
/tmp/ccxaGNai.s:2262: Error: .err encountered
arm-buildroot-linux-gnueabi-gcc.br_real: warning: /home/sbeckwit/sp_dev/bowie_dev/src/include: linker input file unused because linking not done
CC security/keys/key.o
scripts/Makefile.build:309: recipe for target 'kernel/fork.o' failed
- аналогичные сообщения для kernel / exit.o и fs / fat / dir.o
Построил компилятор G CC 8.3 и столкнулся с точно такими же ошибками.
Построил G CC 7.5 Компилятор и эта ошибка больше не существует (хотя у нас есть другие проблемы)
Было определено, что для соблюдения политики корпоративной безопасности мы должны иметь G CC 8.x или выше.
Поэтому: - Я переустановил G CC 7.5 и получил выходные файлы .i / .s (используя ключ -save-temps в Makefile ядра) - Затем я переключился на G CC 8.3 и получены те же файлы.
G CC 8.3 Информация:
sbeckwit@ubuntu:~/sp_dev/sp_archives/toolchains/arm8.x-toolchain/bin$ ./arm-arm-linux-gnueabi-gcc-8.3.0 --version
arm-arm-linux-gnueabi-gcc-8.3.0.br_real (Buildroot 2020.02) 8.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Ошибка: * 104 4 *
fork.s: Assembler messages:
fork.s:2277: Error: .err encountered
scripts/Makefile.build:308: recipe for target 'kernel/fork.o' failed
Это в функции: mm_release ()
.LBB1932:
.loc 8 110 35 is_stmt 0 view .LVU654
mov r2, sp
bic r2, r2, #8128
bic r2, r2, #63
.LBE1932:
.LBE1933:
.loc 1 784 278 view .LVU655
mov r0, r5
.LVL102:
.loc 1 784 303 is_stmt 1 view .LVU656
.loc 1 784 39 is_stmt 0 view .LVU657
ldr r1, [r2, #8]
.LVL103:
.loc 1 784 326 view .LVU658
sub r1, r1, #1
.LVL104:
.loc 1 784 351 is_stmt 1 view .LVU659
.loc 1 784 379 view .LVU660
.loc 1 784 947 view .LVU661
.syntax divided
@ 784 "kernel/fork.c" 1
.ifnc r0,r0 ; .err ; .endif
**.ifnc r3,r2 ; .err ; .endif**
.ifnc r1,r1 ; .err ; .endif
bl __put_user_4
@ 0 "" 2
.LVL105:
выделенная строка - строка 2277 из сообщения об ошибке
Когда я grep'd через .s файлы, сгенерированные для сборки 8.3, ища «.ifnc» в текущих файлах. Тем не менее, этот файл является единственным файлом, в котором этот .ifn c имеет «разные» регистры: все остальные экземпляры показывают тот же регистр. Чем он отличается.
Из файла fork.i для этой функции:
# 747 "kernel/fork.c"
void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
if (__builtin_expect(!!(tsk->robust_list), 0)) {
exit_robust_list(tsk);
tsk->robust_list = ((void *)0);
}
if (__builtin_expect(!!(!list_empty(&tsk->pi_state_list)), 0))
exit_pi_state_list(tsk);
uprobe_free_utask(tsk);
do { } while (0);
# 777 "kernel/fork.c"
if (tsk->clear_child_tid) {
if (!(tsk->flags & 0x00000400) &&
(*(volatile int *)&(&mm->mm_users)->counter) > 1) {
({ might_fault(); ({ unsigned long __limit = current_thread_info()->addr_limit - 1; const typeof(*(tsk->clear_child_tid)) *__tmp_p = (tsk->clear_child_tid); register const typeof(*(tsk->clear_child_tid)) __r2 asm("r2") = (0); register const typeof(*(tsk->clear_child_tid)) *__p asm("r0") = __tmp_p; register unsigned long __l asm("r1") = __limit; register int __e asm("r0"); switch (sizeof(*(__p))) { case 1: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "1" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 2: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "2" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 4: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "4" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 8: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "8" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; default: __e = __put_user_bad(); break; } __e; }); });
sys_futex(tsk->clear_child_tid, 1,
1, ((void *)0), ((void *)0), 0);
}
tsk->clear_child_tid = ((void *)0);
}
if (tsk->vfork_done)
complete_vfork_done(tsk);
}
ПРИНЯТЬ: - Учитывая, что G CC 9.2.0 выдает ту же ошибку, мы предполагаем, что такая же проблема существует и в этом компиляторе.
G CC 7.5 Информация:
sbeckwit@ubuntu:~/sp_dev/sp_archives/toolchains/arm7.5-toolchain/bin$ ./arm-buildroot-linux-gnueabi-gcc --version
arm-buildroot-linux-gnueabi-gcc.br_real (Buildroot 2020.02) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
с использованием той же сгенерированной ошибки для справки:
fork.s: Assembler messages:
fork.s:2277: Error: .err encountered
scripts/Makefile.build:308: recipe for target 'kernel/fork.o' failed
Это в функции : mm_release ()
.LBE1879:
.loc 1 784 0
mov r2, r3
.LVL102:
mov r0, r5
.LVL103:
ldr r1, [r1, #8]
sub r1, r1, #1
.LVL104:
.syntax divided
@ 784 "kernel/fork.c" 1
.ifnc r0,r0 ; .err ; .endif
**.ifnc r2,r2 ; .err ; .endif**
.ifnc r1,r1 ; .err ; .endif
bl __put_user_4
@ 0 "" 2
.LVL105:
.arm
.syntax unified
выделенная строка соответствует указанной выше ошибке в компиляторе 8.3.0
Из файла fork.i для этой функции:
# 747 "kernel/fork.c"
void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
if (__builtin_expect(!!(tsk->robust_list), 0)) {
exit_robust_list(tsk);
tsk->robust_list = ((void *)0);
}
if (__builtin_expect(!!(!list_empty(&tsk->pi_state_list)), 0))
exit_pi_state_list(tsk);
uprobe_free_utask(tsk);
do { } while (0);
# 777 "kernel/fork.c"
if (tsk->clear_child_tid) {
if (!(tsk->flags & 0x00000400) &&
(*(volatile int *)&(&mm->mm_users)->counter) > 1) {
({ might_fault(); ({ unsigned long __limit = current_thread_info()->addr_limit - 1; const typeof(*(tsk->clear_child_tid)) *__tmp_p = (tsk->clear_child_tid); register const typeof(*(tsk->clear_child_tid)) __r2 asm("r2") = (0); register const typeof(*(tsk->clear_child_tid)) *__p asm("r0") = __tmp_p; register unsigned long __l asm("r1") = __limit; register int __e asm("r0"); switch (sizeof(*(__p))) { case 1: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "1" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 2: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "2" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 4: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "4" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; case 8: __asm__ __volatile__ ( ".ifnc " "%0" "," "r0" " ; .err ; .endif\n\t" ".ifnc " "%2" "," "r2" " ; .err ; .endif\n\t" ".ifnc " "%3" "," "r1" " ; .err ; .endif\n\t" "bl __put_user_" "8" : "=&r" (__e) : "0" (__p), "r" (__r2), "r" (__l) : "ip", "lr", "cc"); break; default: __e = __put_user_bad(); break; } __e; }); });
sys_futex(tsk->clear_child_tid, 1,
1, ((void *)0), ((void *)0), 0);
}
tsk->clear_child_tid = ((void *)0);
}
if (tsk->vfork_done)
complete_vfork_done(tsk);
}
Код ядра такой же. Варианты сборки одинаковы. Разница в используемом компиляторе, все остальные утилиты инфраструктуры (например, Make 4.1) одинаковы.