Кросс-компиляция модулей ядра с использованием заголовков ядра из rootfs целевой платы ARM

У меня есть плата OLinuXino. Я загрузил файл img ArchLinux (ArchLinuxARM-2013.02-olinuxino-rootfs.img) и записал его на SD-карту с помощью dd и загрузил плату с помощью карты. Я подключил плату к Интернету с помощью Ethernet, установил gcc и сделал на нем с помощью pacman. Я смог построить программу пользовательского пространства для платы на плате.

В образе SD-карты ArchLinux уже был каталог заголовков ядра в rootfs (/lib/modules/linux-3.7.2-2-ARCH/build). Так что я смог построить загружаемые модули ядра для платы и на самой плате.

У меня есть компьютер для разработки Ubuntu 12.04.1. Я установил на него Sourcery CodeBench Lite для ARM GNU / Linux (arm-2012.09-64-arm-none-linux-gnueabi.bin). Я могу кросс-компилировать программы пользовательского пространства для OLinuXino на этом ПК разработки, передавать их на плату через SFTP и запускать на плате (используя консоль через последовательный порт ttyAMA0).

Теперь я хочу кросс-компиляцию модулей ядра для платы OLinuXino. Я сделал это ранее для другой платы imx233 пользовательской сборки - в этом случае я настроил систему сборки ядра (LTIB), чтобы оставить исходные коды ядра и rootfs нетронутыми после сборки образа. Таким образом, я смог указать каталог сборки заголовков ядра для кросс-компиляции модуля ядра, и это сработало.

На этот раз для OLinuXino у меня нет источников сборки, поэтому я скопировал rootfs (используя cp -dR) на свой ПК с Ubuntu и попытался перекрестно скомпилировать модуль ядра hello world, указав каталог заголовков ядра как / lib / modules / linux- 3.7.2-2-ARCH / build и выдает следующую ошибку:

anurag@anurag-VirtualBox:~/HelloKS$ make
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -C /mnt/ArchOL/lib/modules/3.7.2-2-       ARCH/build M=/home/anurag/HelloKS modules
make[1]: Entering directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
  CC [M]  /home/anurag/HelloKS/khello.o
/bin/sh: scripts/basic/fixdep: cannot execute binary file
make[2]: *** [/home/anurag/HelloKS/khello.o] Error 126
make[1]: *** [_module_/home/anurag/HelloKS] Error 2
make[1]: Leaving directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
make: *** [all] Error 2

Бинарный файл fixdep в папке скриптов был предварительно скомпилирован для ARM, поэтому я удалил его, перекомпилировал для x86 и поместил туда. Когда я снова попробовал кросс-компиляцию модуля ядра, возникла аналогичная ошибка с жалобой на другой исполняемый файл в папке скриптов (на этот раз modpost).

Мой вопрос в том, как я могу заменить эти двоичные файлы arm в папке kernel-header / build на версию x86? есть ли сценарий в папке сборки для этого? Могу ли я заменить папку сценариев в скопированном ArchLinux на папку сценариев из папки сборки модуля ядра Ubuntu? Или я могу изменить make-файл модулей ядра, чтобы указать сценарию сборки перестроить двоичные файлы в папке сценариев, или использовать другую папку сценариев для этого двоичного файла (я бы указал) путь к папке сценариев ubuntu в папке заголовков ядра? Или я ошибаюсь, и есть лучший способ настроить кросс-компиляцию для платы и настройки, которые у меня есть?

PS. К вашему сведению: кросс-компилятор использует libc 2.16, а в ArchLinux img для OLinuXino есть libc 2.17.


person lithiumhead    schedule 05.04.2013    source источник
comment
Сохраните .config, используйте make distclean в скопированном каталоге и затем скомпилируйте ядро ​​на ПК. После этого все двоичные файлы должны быть правильно настроены.   -  person artless noise    schedule 05.04.2013
comment
Я успешно использовал scripts хоста (через mount --bind), чтобы скомпилировать исходный код, но потом у меня возникла странная ошибка с modpost: FATAL: section header offset=11258999068426292 in file '/ldata/DATA/src/rtl8192eu-linux-driver/8192eu.o' is bigger than filesize=1100031   -  person lilydjwg    schedule 11.09.2015
comment
Я наконец заставил это работать, запустив modpost с qemu-arm :-)   -  person lilydjwg    schedule 11.09.2015


Ответы (2)


Я успешно скомпилировал модуль без исходных кодов ядра, только с заголовками ядра. Я использовал файлы библиотеки версий qemu и ARM из gcc-libs и glibc.

Просто скопируйте каталог сценариев хоста, чтобы переопределить каталог ARM, кроме программы mod/modpost. Отредактируйте mod/Makefile.modpost, чтобы программа modpost запускалась с qemu-arm. Если вы не хотите фактически изменять эти файлы, вы можете использовать aufs / overlayfs / bind mount для достижения того же.

Установите QEMU_LD_PREFIX там, где находятся ваши файлы библиотеки ARM, убедитесь, что qemu-arm ... / modpost действительно работает. Затем запустите make, как вы пытались сделать.

Если вы умеете читать по-китайски, можете прочитать мой опыт здесь.

person lilydjwg    schedule 13.09.2015

Если вы компилируете для x86, следует указать каталог заголовков ядра как /lib/modules/linux-3.7.2-2-ARCH/build. Для кросс-компиляции мы либо загрузим исходный код Linux, либо воспользуемся исходным кодом Linux, предоставленным производителем SOC. Заголовок ядра загруженного исходного кода Linux должен быть указан для компиляции. Предположим, что ваш загруженный исходный код linux находится в каталоге / opt, тогда образец "Makefile" будет выглядеть так

obj-m += name-of-driver.o  
make -C /opt/linux(specify full version) M=${PWD} modules

Необходимо установить кросс-компилятор и экспортировать, т.е. export PATH=$PATH:<absolute-path-of-cross-compiler-binaries>. При компиляции с использованием утилиты make укажите make ARCH=arm(Target for which you are compiling) CROSS_COMPILE=arm-none-linux-gnueabi-. После выполнения всех этих процедур вы успешно скомпилируете модуль ядра для target.

person Gautham Kantharaju    schedule 24.04.2013