Linux 编译 |入口点无效

Linux compilation | Invalid entrypoint

我正在使用 mipsel 工具链编译 linux kernel

一切正常,除了最后一点表明入口点无效:

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=`   | grep kernel_entry`

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

if [ -n "$fs" ]; then
    echo "0x"`   | grep kernel_entry | cut -c9- | awk '{print }'`
else
    echo "0x"`   | grep kernel_entry | cut -c1- | awk '{print }'`
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

这看起来像是环境变量值不正确导致的路径问题。
错误消息 sh: 0: Can't open /arch/mips/boot/tools/entry 是相对于 / 的完整路径,即根目录,而不是正确指定内核源代码实际存储的位置,例如/home/your_username/rg300_kernel/arch/mips/boot/tools/entry.

Question: What exactly generates kernel entry point and what potentially could be done to fix the issue?

问题不在于脚本本身,而在于如何调用脚本。
您的内核源所在的目录路径指定不正确。
因为从未找到和执行脚本,所以没有为指定入口点的 -e 选项提供任何值。
因此,mkimage 实用程序(错误地)抱怨 “无效入口点”,但实际问题是无法获得任何值,因为脚本是从未定位和执行。


指定脚本路径的显着文字是:

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

您的构建输出表明 obj 环境变量已正确设置为 arch/mips/boot
但是 KBUILD_SRC 似乎被错误地设置为 / (根目录)或者是空白的(???!!!)或者是未定义的,而不是类似于 /home/your_username/rg300_kernel 或任何正确的路径。

对于解决方法,您可以尝试在 [=60= 中将变量 KBUILD_SRC 替换为 srctree ]:

 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 被破坏或未导出,但生成文件(和脚本)不是我的专长,所以我无法解释根本原因。