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