Компиляция Linux | Неверная точка входа

Я компилирую ядро ​​Linux с помощью набора инструментов mipsel.

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

sh: 0: Can't open /arch/mips/boot/tools/entry
rm -f arch/mips/boot/vmlinux.bin.gz
gzip -9 arch/mips/boot/vmlinux.bin
mkimage -A mips -O linux -T kernel -C gzip \
    -a 0x80010000 -e  \
    -n 'Linux-2.6.31.3-g29b45174-dirty' \
    -d arch/mips/boot/vmlinux.bin.gz arch/mips/boot/uImage
mkimage: invalid entry point -n

Теперь упоминается sh: 0: Can't open /arch/mips/boot/tools/entry

Итак, я проверил этот файл, и в нем есть следующее:

#!/bin/sh

# grab the kernel_entry address from the vmlinux elf image
entry=`$1 $2  | grep kernel_entry`

fs=`echo $entry | grep ffffffff`  # check toolchain output

if [ -n "$fs" ]; then
    echo "0x"`$1 $2  | grep kernel_entry | cut -c9- | awk '{print $1}'`
else
    echo "0x"`$1 $2  | grep kernel_entry | cut -c1- | awk '{print $1}'`
fi

Теперь я понимаю, что что-то генерирует точку входа в ядро, но эта сгенерированная точка входа недействительна.

Вопрос: что именно создает точку входа в ядро ​​и что потенциально можно сделать для устранения проблемы?

Проблема может быть воспроизведена с помощью следующих шагов:


Инструкции по составлению:

$ cd
$ wget https://github.com/steward-fu/a320/releases/download/v1.0/mipsel-4.1.2-nopic.tar.bz2
$ tar xvf mipsel-4.1.2-nopic.tar.bz2
$ sudo mv mipsel-4.1.2-nopic /opt/rg300
$ export PATH=$PATH:/opt/rg300/bin
$ git clone https://github.com/rs-97-cfw/rs97-linux-kernel-NoNDA rg300_kernel
$ cd rg300_kernel
$ ARCH=mips make uImage

person user0193    schedule 26.12.2020    source источник
comment
/arch/mips/boot/tools/entry исполняемый файл? Вы пробовали запустить его?   -  person stark    schedule 27.12.2020
comment
ну, я просто сделал его исполняемым с помощью chmod + x entry, но он по-прежнему не работает. Может быть, сама точка входа плохая, поэтому просто хочу знать, что я могу искать для устранения неполадок?   -  person user0193    schedule 27.12.2020
comment
Вы запустили запись, и я дал ту же ошибку?   -  person stark    schedule 27.12.2020
comment
Пожалуйста, поделитесь скриптом, который вы выполняете и который выдает цитируемый вами результат.   -  person Xypron    schedule 28.12.2020
comment
@stark я получаю 0x только тогда, когда запускаю . entry. В любом случае я обновил инструкции по компиляции, чтобы воспроизвести проблему. Это небольшой образ ядра, поэтому он займет всего 2 минуты или меньше   -  person user0193    schedule 29.12.2020
comment
@Xypron, хорошее замечание. Я обновил вопрос инструкциями по компиляции, чтобы воспроизвести проблему. Это действительно крошечное ядро ​​Linux, которое быстро компилируется за пару минут.   -  person user0193    schedule 29.12.2020
comment
Запись @stark не должна запускаться как отдельный исполняемый файл.   -  person gfdsal    schedule 29.12.2020
comment
@gfdsal Почему? Пока вы приводите правильные аргументы, он должен давать результат. Скорее всего дело в аргументах, так как скрипт простой   -  person stark    schedule 29.12.2020
comment
@stark да, это то, что я имел в виду, запускать его как автономный, точно так же, как то, что сделал op, не получит аргументы, поскольку аргументы создаются во время компиляции   -  person gfdsal    schedule 29.12.2020
comment
Это похоже на проблему пути, вызванную неправильным значением переменной среды. Сообщение об ошибке sh: 0: Can't open /arch/mips/boot/tools/entry относится к /, то есть к корневому каталогу, а не к тому месту, где фактически хранится ваш исходный код ядра. Попробуйте вставить несколько команд echo 'KBUILD_SRC = ' $KBUILD_SRC и echo 'obj = ' $obj непосредственно перед командой mkimage в разделе uImage: файла arch / mips / boot / Makefile   -  person sawdust    schedule 08.01.2021


Ответы (1)


Это похоже на проблему пути, вызванную неправильным значением переменной среды.
Сообщение об ошибке sh: 0: Can't open /arch/mips/boot/tools/entry - это полный путь относительно /, то есть корневого каталога, вместо того, чтобы правильно указывать, где на самом деле хранится исходный код ядра, например /home/your_username/rg300_kernel/arch/mips/boot/tools/entry.

Вопрос: Что именно создает точку входа в ядро ​​и что потенциально можно сделать для устранения проблемы?

Проблема не в самом скрипте, а в том, как он вызывается.
Неправильно указан путь к каталогу, в котором находится исходный код ядра.
Поскольку скрипт никогда не обнаруживается и не выполняется, значение отсутствует. предусмотрена опция -e для указания точки входа.
Следовательно, утилита mkimage (ошибочно) жалуется на недопустимую точку входа, но реальная проблема заключается в том, что нет значение было получено, потому что сценарий никогда не был обнаружен и выполнен.


Основной текст для указания пути к сценарию:

$(KBUILD_SRC)/$(obj)/tools/entry

Выходные данные вашей сборки показывают, что для переменной среды obj правильно установлено значение arch/mips/boot.
Но для KBUILD_SRC, похоже, неправильно установлено значение только / (корневой каталог) или пусто (??? !!!) или не определено, а не что-то вроде /home/your_username/rg300_kernel или другой правильный путь.

В качестве обходного пути вы можете попробовать заменить переменную KBUILD_SRC на srctree в arch / mips / boot / Makefile:

 uImage: $(VMLINUX) vmlinux.bin
     rm -f $(obj)/vmlinux.bin.gz
     gzip -9 $(obj)/vmlinux.bin
     mkimage -A mips -O linux -T kernel -C gzip \
-        -a $(LOADADDR) -e $(shell sh $(KBUILD_SRC)/$(obj)/tools/entry $(NM) $(VMLINUX) ) \
+        -a $(LOADADDR) -e $(shell sh $(srctree)/$(obj)/tools/entry $(NM) $(VMLINUX) ) \
         -n 'Linux-$(KERNELRELEASE)' \
         -d $(obj)/vmlinux.bin.gz $(obj)/uImage
     @echo '  Kernel: arch/mips/boot/$@ is ready' 

Переменная srctree, по-видимому, является производной от KBUILD_SRC (в Makefile ядра верхнего уровня), и ее использование в качестве замены на самом деле является WAG для обходного пути.
Возможно, где-то KBUILD_SRC затирается или не экспортируется, но make-файлы (и скрипты) не являются моими знаниями, поэтому я не могу объяснить основную причину.

person sawdust    schedule 08.01.2021
comment
Это действительно сработало, но я немного потерялся в объяснении (простите меня). Вы говорите, что он не нашел правильный путь? и почему, как вы выразились, when the actual problem is that it is missing because the script never executed, KBUILD_SRC не находит правильного местоположения? - person user0193; 08.01.2021
comment
Это действительно сработало - Рад помочь. Пожалуйста, просмотрите правки к моему ответу, чтобы, надеюсь, лучше объяснить. Вы также можете отладить это дальше, вставив эхо-команды в Makefile; см. мой исходный комментарий к вашему вопросу выше. Кстати, я читал ваш вопрос раньше, но поскольку он включал MIPS, make-файлы и сценарии, я передал его. Ваша вежливая просьба и награда побудили меня проанализировать ее еще раз, поэтому ваши действия были эффективными! - person sawdust; 09.01.2021
comment
Я рад, что привлек ваше внимание. Ядро скомпилировано идеально после ваших правок, и я смог даже загрузиться с ним на КПК MIPS! Большое спасибо! - person user0193; 09.01.2021