【问题标题】:Linux compilation | Invalid entrypointLinux 编译 |入口点无效
【发布时间】:2021-04-04 06:45:36
【问题描述】:

我正在使用 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=`$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

【问题讨论】:

  • /arch/mips/boot/tools/entry 是否可执行?你试过运行它吗?
  • 好吧,我只是通过 'chmod +x entry' 让它可执行,但它仍然不起作用。也许入口点本身很糟糕,所以只想知道我可以解决什么问题?
  • 你跑了条目,我也报了同样的错误?
  • 请分享您正在执行的脚本并产生您引用的输出。
  • @stark 我只有在运行. entry 时才会得到0x。无论如何,我已经更新了编译说明以重现该问题。它是一个小内核映像,因此只需 2 分钟或更短时间

标签: linux-kernel u-boot entry-point


【解决方案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 或任何正确的东西路径是。

对于解决方法,您可以尝试在 arch/mips/boot/Makefile 中将变量 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 被破坏或无法导出,但 makefile(和脚本)不是我的专长,因此我无法解释根本原因。

【讨论】:

  • 这确实有效,但我在解释中有点迷失了(请原谅我)。你是说它没有找到“正确的路径”吗?为什么正如您所说的 when the actual problem is that it is missing because the script never executedKBUILD_SRC 没有找到正确的位置?
  • “这确实有效” -- 很高兴能提供帮助。请参阅我的答案的编辑,以获得更好的解释。您还可以通过将 echo 命令插入 Makefile 来进一步调试它;请参阅我对上述问题的原始评论。顺便说一句,我之前读过你的问题,但因为它涉及 MIPS、makefile 和脚本,所以我传递了它。你的礼貌请求和赏金让我再次分析它,所以你的行动是有效的!
  • 很高兴得到您的关注。内核在您编辑后完美编译,我什至可以在 MIPS 手持设备上启动它!非常感谢!
猜你喜欢
  • 2021-01-30
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2017-10-25
  • 2019-08-16
  • 1970-01-01
相关资源
最近更新 更多