G CC 8.3 Ошибка сборки ARM при сборке Linux ядра 3.14.17 в настройке Build root 2020.02 - PullRequest
0 голосов
/ 15 апреля 2020

Миграция из 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) одинаковы.

...