Как собрать OS/ABI для SystemV с помощью crosstool-ng

Я пытаюсь собрать модуль ядра для моего DNS-320L NAS.

Я собрал crosstool-ng в среде Debian lenny chroot, но после того, как я скомпилировал свой модуль ядра и попытался установить его, я получаю:

insmod: error inserting 'kernel/net/ip4/ipip.ko': -1 Invalid module format

Когда я проверяю работающий модуль ядра с помощью readelf, я получаю:

~/ct-ng-build$ readelf -h ~/ct-ng-build/kernel/orig/ipip.ko 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          6696 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         51

Но мой модуль имеет несколько отличий:

~/ct-ng-build$ readelf -h ~/ct-ng-build/kernel/modules/lib/modules/2.6.31.8/kernel/net/ipv4/ipip.ko 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          6280 (bytes into file)
  Flags:                             0x600, GNU EABI, software FP, VFP
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         23
  Section header string table index: 20

Моя среда cross_compile:

$ echo $CROSS_COMPILE 
arm-none-eabi-


make CROSS_COMPILE=${CROSS_COMPILE} INSTALL_PATH=~/ct-ng-build/kernel/install INSTALL_MOD_PATH=~/ct-ng-build/kernel/modules INSTALL_FW_PATH=~/ct-ng-build/kernel/firmware

Мой gcc скомпилирован:

$  ${CROSS_COMPILE}gcc -v
Using built-in specs.
Target: arm-none-eabi
Configured with: ~/ct-ng-build/targets/src/gcc-4.3.2/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-none-eabi --prefix=~/x-tools/arm-none-eabi --with-local-prefix=~/x-tools/arm-none-eabi/arm-none-eabi//sys-root --disable-multilib --disable-libmudflap --with-sysroot=~/x-tools/arm-none-eabi/arm-none-eabi//sys-root --with-newlib --enable-threads=no --disable-shared --with-pkgversion=crosstool-NG-1.9.0 --with-arch=armv5te --with-tune=arm926ej-s --disable-__cxa_atexit --with-gmp=~/ct-ng-build/targets/arm-none-eabi/build/static --with-mpfr=~/ct-ng-build/targets/arm-none-eabi/build/static --enable-target-optspace --disable-nls --enable-symvers=gnu --enable-languages=c,c++
Thread model: single
gcc version 4.3.2 (crosstool-NG-1.9.0)

Любые идеи, как сделать OS/ABI «UNIX — System V», а флаги — «0x5000000, Version5 EABI» вместо «Arm» и «0x600, GNU EABI, software FP, VFP»?

Или есть другая проблема?

Спасибо!

--- РЕДАКТИРОВАТЬ ---- Я специально пытаюсь настроить свою существующую ОС NAS:

Kernel  2.6.31.8 #1 armv5tel
C library   gcc-4.3-mt-1.44.0 

# /lib/libc-2.8.so 
GNU C Library stable release version 2.8, by Roland McGrath et al.
Copyright (C) 2008 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.
Compiled by GNU CC version 4.3.2.

До сих пор мне удалось создать среду crosstool-ng только с помощью crosstool-ng-1.9.0, но она создала двоичные файлы, указанные выше.

Я попытался установить -mabi=apcs-gnu в соответствии с 3.17.2 Параметры ARM но библиотека C не будет компилироваться со странными ошибками "отсутствующие заголовки" (я могу попробовать еще раз - возможно, что-то с моей средой chroot).


person KevinM    schedule 16.09.2017    source источник
comment
Тот факт, что оригинальный toochain был создан с использованием определенной версии crosstool-NG, не означает, что вы должны делать то же самое. Вы действительно хотите сопоставить тип целевой библиотеки C (например, glibc или uClibc) и номер версии и использовать заголовки ядра для той же версии ядра. Может быть некоторая свобода действий с номерами версий компонентов цепочки инструментов, например. компилятор gcc и binutils, но crosstool-NG должен позволять вам указывать версии, которые вы хотите, если вы не отклоняетесь от слишком старого или слишком нового от того периода времени.   -  person sawdust    schedule 18.09.2017
comment
Я пытался скомпилировать crosstool-ng-13.2, но он не смог скомпилировать общий компилятор gcc 4.3.2 и gcc 4.3.3 (и, следовательно, окончательный компилятор). Я попробую еще раз скомпилировать 19.0. (который был скомпилирован ранее - по крайней мере, процесс сборки ct-ng сохраняет журнал и конфигурацию в целевом каталоге x-tools).   -  person KevinM    schedule 19.09.2017
comment
Вам нужно еще раз проверить, что ваш набор инструментов действительно предназначен для EABI, а не для OABI. Я сделал аналогичный readelf для модуля ядра, и он дал практически идентичные результаты вашему рабочему модулю ядра. Моя цепочка инструментов, которая создала модуль, предназначена для EABI. IOW, мой ответ обратный, что, кажется, подтверждается заголовком stackoverflow.com/questions/10780648/ . Но ваш префикс набора инструментов arm-none-eabi- противоречит идее, что это OABI.   -  person sawdust    schedule 20.09.2017
comment
Я вернулся к crosstool-NG-1.9.0 (в соответствии с цепочкой инструментов eabi выше), ориентируясь на arm-none-linux-gnu, но теперь мне не удается скомпилировать цепочку инструментов! Я получаю внутреннюю ошибку компилятора в библиотеке C. Я попробую еще раз из свежих исходных кодов tarball и свежей конфигурации примера 1.9.0 arm-none-linux.   -  person KevinM    schedule 20.09.2017


Ответы (2)


Создайте новую цепочку инструментов с помощью crosstool-NG, но настройте ее для OABI, а не для EABI.
См. Настройка crosstool-NG.

Все выпуски Debian (для ARM) до Lenny включительно были OABI.

Ссылка: https://wiki.embeddedarm.com/wiki/EABI_vs_OABI

Несмотря на то, что префикс вашего инструментария равен arm-none-eabi-, созданный им двоичный файл выглядит как OABI.
У меня есть двоичные файлы OABI, которые производят идентичный вывод readelf, и двоичные файлы EABI, которые имеют идентичный вывод readelf ("UNIX - System V"), который вам нужен. .

Этот вопрос описывает аналогичную, но обратную ситуацию. к вашему, то есть его набор инструментов генерирует бинарные файлы EABI, но ему нужен OABI.

Очевидно, ваша цепочка инструментов была создана для создания OABI, но был использован вводящий в заблуждение префикс.
Вам необходимо создать новую цепочку инструментов с помощью crosstool-NG, но настроить ее для EABI, а не для OABI.
Более новые версии crosstool-NG на самом деле делают конфигурация для OABI затруднена принудительным выбором EABI, если не включен Use obsolete features.


ДОПОЛНЕНИЕ

Вы говорите: «Но настройте его для OABI, а не для EABI», но как?

Используя установку crosstool-NG v1.18, я могу указать и собрать
* версию ядра Linux 2.6.31.14,
* версию gcc 4.3.2,
* версию binutils 2.18a 2.19.1a,
* glibc версии 2.8.

Чтобы отменить выбор Target options ---> Use EABI (отмена выбора означает использование OABI),
сначала нужно выбрать Paths and misc options ---> Use obsolete features.

В этой версии crosstool-NG автоматически выбирается Use EABI.


В описании пункта меню Use EABI есть:

Set up the toolchain so that it generates EABI-compliant binaries.

If you say 'n' here, then the toolchain will generate OABI binaries.
OABI has long been deprecated, and is now considered legacy.

Поскольку OABI считается устаревшим в этой версии crosstool-NG, символ конфигурации ARCH_ARM_EABI_FORCE активен, если не указано Use obsolete features.

person sawdust    schedule 16.09.2017
comment
Сейчас пробую crosstool-ng 1.4. Вы говорите, но настройте его для OABI, а не для EABI., но как? Единственная опция EABI, которая у меня есть, — это один флажок, который определяет # CT_ARCH_ARM_EABI не установлен или CT_ARCH_ARM_EABI=y - person KevinM; 17.09.2017
comment
Я пробую crosstool-ng 1.4 -- Разве это не довольно старая версия? Похоже, вы пытаетесь напрямую изменить файл .config . Почему вы не используете менюконфиг? См. раздел Настройка crosstool-NG. - person sawdust; 18.09.2017
comment
Извините за неправильное впечатление - я всегда использую menuconfig, но не могу найти никаких настроек для OABI. Я пробовал версию 1.4, так как эта версия использовалась для сборки существующего ядра (версия Linux 2.6.31.8 (jack@swtest6) (версия gcc 4.3.2 (sdk3.3-ct-ng-1.4.1)) #1 Ср, 22 августа, 16:55:05 CST 2012). - person KevinM; 18.09.2017
comment
Что ж, если ваша существующая цепочка инструментов была построена с CT_ARCH_ARM_EABI=y, тогда вам нужно обратное, # CT_ARCH_ARM_EABI не установлено. - person sawdust; 18.09.2017
comment
В настоящее время я не могу даже построить набор инструментов CT. Все еще пытаюсь, см. комментарии выше. - person KevinM; 19.09.2017
comment
Я попробую указанные вами версии и параметры конфигурации (я их видел, поэтому знаю, о чем вы говорите). Можете ли вы подтвердить, что можете создать цепочку инструментов, как указано выше, из коробки (свежие загрузки из мест загрузки по умолчанию и т. д.)? - person KevinM; 20.09.2017
comment
В моей системе с CT-NG v1.18.0 binutils 2.18a не компилируется (в отличие от 2.19.1a). Однако при отключенном EABI gcc 4.3.2 не компилируется (внутренняя ошибка компилятора: в arm_dbx_register_number) - person KevinM; 20.09.2017
comment
@KevinM В моей системе с CT-NG v1.18.0 binutils 2.18a не компилируется (в то время как 2.19.1a компилируется) -- здесь то же самое. Но вы не хотите OABI, вы хотите EABI. Смотрите пересмотренный ответ. - person sawdust; 21.09.2017
comment
Я не могу настроить свой CT-NG v1.18.0 для компиляции EABI, либо проверяя характеристики динамического компоновщика... configure: ошибка: тесты ссылок не разрешены после GCC_NO_EXECUTABLES.. Я буду исследовать дальше. - person KevinM; 21.09.2017
comment
Обязательно ct-ng clean между ct-ng menuconfig и ct-ng build. - person sawdust; 21.09.2017
comment
Я не знаю, что не так со средой RHEL, где я получаю вышеуказанную ошибку, но я вернулся к своему CT-NG 1.9.0 со сборкой EABI. В качестве последнего шага я могу заставить ядро ​​создавать совместимые двоичные файлы, отредактировав файл arch/arm/Makefile и удалив -mabi=aapcs-linux из раздела CONFIG_AEABI. ОДНАКО теперь я получаю modprobe: не удается загрузить модуль ntfs (kernel/fs/ntfs/ntfs.ko): неизвестный символ в модуле или неизвестный параметр. Но, по крайней мере, на мой первоначальный вопрос был дан ответ (я думаю). - person KevinM; 22.09.2017

Я извлекаю некоторые заключительные комментарии здесь:

Как рекомендует @sawdust, я использую EABI в следующей среде CT-NG:

crosstool-NG version: 1.9.0
gcc 4.3.2
binutils 2.19.1
libc 2.8
gmp 4.3.2
mpfr 2.4.2

Чтобы компилятор GCC скомпилировался, мне пришлось сделать пару хаков! А именно:

  • удалить res_hconf.c из targets/src/glibc-2.8/nscd (один раз, после извлечения исходников)
  • удалить res_hconf из списка объектов в nscd/Makefile
  • создать программную ссылку на stubs-32.h из stubs-.h в ~/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi//sys-root/usr/include/gnu (после начала сборки).

Мне просто нужно было загрузить правильное ядро ​​​​Linux и установить его. Отсутствовала команда:

make ARCH=arm kirkwood_defconfig

После этого мне просто пришлось использовать make ARCH=arm menuconfig для настройки вещей.

gcc -v говорит:

Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with: ~/ct-ng-build/targets/src/gcc-4.3.2/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-unknown-linux-gnueabi --prefix=~/x-tools/arm-unknown-linux-gnueabi --with-sysroot=~/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv5te --with-tune=arm926ej-s --with-float=soft --disable-shared --with-pkgversion=crosstool-NG-1.9.0 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=~/ct-ng-build/targets/arm-unknown-linux-gnueabi/build/static --with-mpfr=~/ct-ng-build/targets/arm-unknown-linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=~/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi//sys-root --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.3.2 (crosstool-NG-1.9.0) 

Наконец, для генерации модулей SYSV мне пришлось взломать ядро ​​arch/arm/Makefile, чтобы удалить параметр -mabi=aapcs-linux из раздела EABI.

Теперь ошибка:

"modprobe: can't load module ntfs (kernel/fs/ntfs/ntfs.ko): unknown symbol in module, or unknown parameter

Это уже другой вопрос :D

Я все еще не могу собрать работающий модуль ядра (возможно, из-за хаков!), но это также может быть связано с тем, что у меня нет .config совместимого ядра для NAS.

Окончательные изменения:

  • Не использовать раскрутку
  • Отключите некоторую отладку и трассировку ядра.
  • использовать SLAB вместо SLUB

Изменения были выбраны путем отслеживания сообщений dmsg.

Теперь можно загрузить полученные скомпилированные модули ядра, если они совместимы с скомпилированным ядром.

(Предупреждение: у меня возникли небольшие проблемы, когда я начал добавлять iptables модулей, когда мое сетевое соединение было заблокировано! Будьте осторожны! К счастью, модули не перезагружаются при перезагрузке. )

person KevinM    schedule 22.09.2017
comment
но это также может быть связано с тем, что у меня нет совместимого файла .config ядра для NAS -- Не то чтобы я делал что-то подобное, но у меня сложилось впечатление, что файл System.map был заметный. - person sawdust; 25.09.2017
comment
На самом деле, моя сборка не создает System.map (и, следовательно, не создает и modules.dep. Я копирую его откуда-то еще). - person KevinM; 30.09.2017
comment
В этом случае dmesg предоставляет все подсказки. Например, после выполнения различных отсутствующих символов (без принудительной раскрутки и т. д.): ieee80211_crypt_tkip: Неизвестный символ wireless_send_event - person KevinM; 30.09.2017