我正在编译一个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
现在我知道有些东西正在生成内核入口点,但生成的入口点无效。
Question:到底是什么生成了内核入口点以及可以采取哪些措施来解决该问题?
可以通过以下步骤重现该问题:
编译说明:
$ 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
.
问题:到底是什么生成了内核入口点以及可以采取哪些措施来解决该问题?
问题不在于脚本本身,而在于如何调用脚本。
内核源代码所在的目录路径指定不正确。
由于从未找到并执行该脚本,因此没有为-e
用于指定入口点的选项。
因此mkimage实用程序(错误地)抱怨“无效的入口点”,但实际问题是无法获取任何值,因为脚本从未被定位和执行。
用于指定脚本路径的显着文本是:
$(KBUILD_SRC)/$(obj)/tools/entry
您的构建输出表明obj环境变量正确设置为arch/mips/boot
.
But KBUILD_SRC似乎被错误地设置为/
(根目录)或为空(???!!!)或未定义,而不是类似的东西/home/your_username/rg300_kernel
或者任何正确的路径是什么。
对于解决方法,您可以尝试替换变量KBUILD_SRC with srctree in 拱门/mips/启动/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被破坏或未导出,但 makefile(和脚本)不是我的专业知识,因此我无法解释根本原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)