Проблемы с кросс-компиляцией ядра и модулей ядра - PullRequest
0 голосов
/ 30 апреля 2020

Я провел последнюю неделю, пытаясь достичь одной цели, которой я до сих пор не достиг.

Моя конечная цель - кросс-компиляция для некоторых архитектур (в этот вопрос я возьму в качестве примера только один, который является MIPSLE) пару модулей ядра, которые я хотел бы использовать на своем домашнем маршрутизаторе, загружая их во время выполнения с помощью INSMOD.

В моем маршрутизаторе отсутствуют некоторые функции iptables, и поэтому во время компиляции ядра тот, кто скомпилировал его, решил от них избавиться.

The current kernel version is quite obsolete: Linux version 2.6.36+ by doing /proc/version

Я прочитал много документации и до сих пор не уверен, что возможно скомпилировать только некоторые модули или, если необходимо, скомпилировать все ядро ​​каждый раз (некоторые люди говорили, что для некоторых модулей это возможно, а для других с большим количеством зависимостей - нет, это правда? ).

В этом случае нужные мне модули ядра находятся в /net/ipv4/netfilter/

Поскольку я не понял, как скомпилировать только модули ядра в автономном режиме Кстати, я решил кросс-скомпилировать все ядро ​​и взять необходимые мне модули.

Итак, я скачал соответствующий набор инструментов (uclib c mipsle toolchain) и мне удалось скомпилировать простой работающий привет Мир, который я выполнил на своем маршрутизаторе, где у меня есть оболочка s sh.

Так что я уверен, что используемая мной цепочка инструментов правильная.


Теперь, так как я хотел протестировать последнюю версию ядра, я скачал последнюю версию Ubuntu 20 с соответствующим ядром и успешно скомпилировал ее, а модули ядра, о которых я говорил ранее, были там внутри папки netfilter в формате .ko , ИДЕАЛЬНО!

Я явно использовал /boot/config_file моего хост-компьютера как .config

Итак, после того как я ' Я скачал ту же версию ядра, что и у моего маршрутизатора (2.6.36), и я попытался скомпилировать ее с помощью файла .config, который я нашел на GitHub и который связан с mipsle-устройством с той же версией ядра.

Здесь я думаю, что у нас есть первая проблема, я попытался найти .config моего устройства, чтобы иметь гладкую конфигурацию, но у меня нет папки /boot, а также не было в /proc.

Как я могу получить это?

В любом случае, я использовал его, и компиляция не выглядела неудачной, но это последние строки:

  CC      drivers/usb/storage/usual-tables.o
  LD      drivers/usb/storage/usb-storage.o
  LD      drivers/usb/storage/built-in.o
  LD      drivers/usb/built-in.o
  LD      drivers/video/built-in.o
  LD      drivers/built-in.o
  LD      vmlinux.o
  MODPOST vmlinux.o
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
  KSYM    .tmp_kallsyms1.S
  AS      .tmp_kallsyms1.o
  LD      .tmp_vmlinux2
  KSYM    .tmp_kallsyms2.S
  AS      .tmp_kallsyms2.o
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/mips/boot/vmlinux.bin
  Building modules, stage 2.
  MODPOST 1 modules
  CC      drivers/scsi/scsi_wait_scan.mod.o
  LD [M]  drivers/scsi/scsi_wait_scan.ko

Там написано "1 модуль", но я не понять, почему и внутри папки /net/ipv4/netfilter теперь у меня есть .o файлы вместо .ko, например, если они не были связаны.

Так как я злился и не знал, что попробовать После нескольких попыток я решил использовать файл конфигурации моего хост-компьютера (Ubuntu 2020, ядро ​​5.4.0.26), и компиляция прошла успешно, с файлами .ko внутри папки.

Проблема заключалась в том, что, очевидно, это были модули, скомпилированные для x86-64 вместо MIPS, и другие явные "проблемы", связанные с конфигурацией моей машины x86-64.

Итак, я думаю, что сейчас что обнаруженный .config может быть как-то сломан, я также попытался отключить, добавив комментарий, этот модуль SCSI, но ничего, я всегда получаю одно и то же.

И, очевидно, между каждой попыткой Я всегда делал make distclean и make clean.

* 10 68 * Что вы предлагаете мне сделать? Я даже не буду публиковать все ссылки, которые я читал об этом материале, потому что я могу sigsegv сервер StackOverflow с таким количеством данных.

Спасибо всем и извините за стену пост.

1 Ответ

0 голосов
/ 01 мая 2020

Я не уверен, возможно ли скомпилировать только некоторые модули или нужно ли компилировать все ядро ​​каждый раз

Ну, вы можете скомпилировать только отдельные модули, но компилирование модуль требует, чтобы ядро ​​было уже собрано. Как только вы сделаете это один раз, вы сможете собрать другие модули по отдельности. То есть, конечно, если вы не хотите sh встраивать их в само ядро ​​(CONFIG_XXX=y вместо CONFIG_XXX=m). Вы должны быть в состоянии скомпилировать только тот модуль, который вам нужен (например, /path/to/linux - это каталог, в котором находится ваш уже собранный исходный код ядра):

$ cd /path/to/linux
$ cd path/to/module/folder
$ make -C /path/to/linux M=$(pwd) modules

Я пытался чтобы найти .config моего устройства, чтобы иметь гладкую конфигурацию, но у меня нет папки /boot, и она также не была в /proc. Как я могу получить это?

Куда вы точно смотрели? Наличие /proc/config.gz зависит от CONFIG_IKCONFIG_PROC ( см. Также здесь ). Если вы не можете найти файл, скорее всего, потому что этот параметр конфигурации был отключен при сборке ядра. Вы можете попробовать поискать под /boot (как вы уже сделали) или под /lib/modules/$(uname -r)/build/.config, но, к сожалению, делать больше нечего.

Я видел людей , предлагающих , пытающихся запустить modprobe configs и затем проверить /proc/config.gz, но это кажется странным, поскольку, насколько я знаю, конфигурация ядра не должна быть настраиваемой, чтобы быть доступной в качестве загружаемого модуля.

Что вы предложить мне сделать?

Ну, самое важное, что вы сейчас хотите, - это найти файл конфигурации для вашего роутера (или совместимого). Если вы не можете найти это, будет довольно сложно все сделать правильно. Возможно, вы захотите поискать версии OpenWRT, доступные для вашего роутера (если есть), или в любом другом месте на inte rnet, если вы можете найти подходящую конфигурацию. Включите марку и / или модель вашего роутера в свои поиски. Однако StackOverflow не может вам в этом особо помочь.

Вы можете попробовать кросс-компиляцию ядра 5.4 с конфигурацией по умолчанию плюс нужный вам модуль. Например, если у вас есть готовый набор инструментов для кросс-компиляции:

cd /path/to/linux
make ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix- defconfig
make ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix- menuconfig

# ... enable the module, tune the config ...

make -j ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix-

В любом случае, учтите тот факт, что переход с ядра 2.6 на 5.4 - это довольно большое изменение, и оно может закончиться ломайте все, поэтому обязательно сделайте резервную копию прошивки вашего роутера, прежде чем пытаться что-либо делать.

...