mkimage 时报错invalid entry point -n

本文介绍了一个在Ubuntu 14.04上编译内核时遇到的invalidentrypoint-n错误,并详细分析了该错误产生的原因及解决方法。通过对比Ubuntu 12.04与14.04的不同之处,最终发现是因为readelf输出的Entry字段被汉化导致的问题。

在最后阶段出现了"invalid entry point -n"的错误,而我在ubuntu12.04上面是可以生成镜像的。以下是出错现场的信息



LZMA 4.57  Copyright (c) 1999-2007 Igor Pavlov  2007-12-06
echo Making uImage...
Making uImage...
cd util && mkuImage.sh /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31 _mi124_f1e lzma
+ MKIMAGE=/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage
+ VMLINUX=/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/vmlinux
+ VMLINUXBIN=/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/arch/mips/boot/vmlinux.bin
+ '[' -z /tftpboot/zhangdanfeng ']'
+ echo /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../build/util/mkuImage.sh Using TFTPPATH=/tftpboot/zhangdanfeng
/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../build/util/mkuImage.sh Using TFTPPATH=/tftpboot/zhangdanfeng
++ grep Entry
++ readelf -a /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/vmlinux
++ head -1
++ cut -d: -f 2
+ ENTRY=
++ grep '\[ 1\]'
++ readelf -a /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/vmlinux
++ head -1
++ cut '-d ' -f 26
+ LDADDR=80002000
+ '[' 4 -gt 3 ']'
+ suffix=_mi124_f1e
+ '[' xxlzma = xxlzma -o xx_mi124_f1e = xxlzma ']'
+ echo '**** Generating vmlinux_mi124_f1e.lzma.uImage ********'
**** Generating vmlinux_mi124_f1e.lzma.uImage ********
+ /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage -A mips -O linux -T kernel -C lzma -a 0x80002000 -e -n 'Linux Kernel Image' -d /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/arch/mips/boot/vmlinux.bin.lzma /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage
/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage: invalid entry point -n
+ cp /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage /tftpboot/zhangdanfeng
cp: 无法获取'/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage' 的文件状态(stat): 没有那个文件或目录


后来我将*argv全部打印出来发现:在ubuntu12.04下,Makefile文件中执行的语句展开后是

/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage -A mips -O linux -T kernel -C lzma -a 0x80002000 -e -n 'Linux Kernel Image' -d /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/arch/mips/boot/vmlinux.bin.lzma /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage

argc的值是18,第12个参数“-e”后面紧接着的是代表入口地址的16进制参数;

但是在ubuntu14.04下,Makefile文件中执行的语句展开后是

**** Generating vmlinux_mi124_f1e.lzma.uImage ********
+ /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage -A mips -O linux -T kernel -C lzma -a 0x80002000 -e -n 'Linux Kernel Image' -d /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../linux/kernels/mips-linux-2.6.31/arch/mips/boot/vmlinux.bin.lzma /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage
/home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../boot/u-boot/tools/mkimage: invalid entry point -n
+ cp /home/zhangdanfeng/work/gaoju/rc_9342_wifi/sdk/build/../images/mi124/vmlinux_mi124_f1e.lzma.uImage /tftpboot/zhangdanfeng

argc的值是17,正是“-e”参数后缺少了入口地址参数,而紧接着“-n”。所以程序就报告了“ nvalid entry point -n”,但是为何会缺少一个参数?

答案就在Makefile里面找。Makefile中通过$(shell readelf -h $(ROOTDIR)/$(LINUXDIR)/vmlinux | grep "Entry" | awk '{print $$4}') 查找入口点地址,但是我们在ubuntu14.04中readelf文件vmlinux才发现Entry竟然被汉化成了“入口点地址”,所以grep Entry肯定找不到啦。最后把“Entry”改成“入口点地址”,再把$$4改成$$2就可以完成编译了。

这种问题着实让人哭笑不得,看来做开发的系统最好还是别汉化。开发中出现疑难异常问题的时候也可以从系统的语言环境考虑下。

`mkimage` 是一个用于创建和操作U-Boot映像的工具。以下是对命令 `mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d rootfs.cpio.gz u-rootfs` 中各参数的详细解释: - `-n "ramdisk"`:为映像设置一个名称,这里将映像的名称设置为 "ramdisk",此名称可用于标识该映像的用途或类型。 - `-A arm`:指定目标硬件平台的架构,`arm` 表示该映像将在ARM架构的硬件上运行。 - `-O linux`:指定操作系统类型,`linux` 表明该映像是为Linux操作系统准备的。 - `-T ramdisk`:指定映像的类型,`ramdisk` 表示这是一个内存盘映像,通常用于在系统启动时提供临时的根文件系统。 - `-C gzip`:指定压缩类型,`gzip` 表示使用gzip算法对映像进行压缩。 - `-d rootfs.cpio.gz`:指定输入文件,`rootfs.cpio.gz` 是一个经过gzip压缩的cpio归档文件,它包含了根文件系统的内容。 - `u-rootfs`:指定输出文件,即生成的U-Boot映像文件的名称。 ### 使用指南 #### 安装 `mkimage` 在大多数基于Debian或Ubuntu的系统中,可以使用以下命令安装 `mkimage`: ```bash sudo apt-get install u-boot-tools ``` 在基于Red Hat或CentOS的系统中,可以使用以下命令安装: ```bash sudo yum install uboot-tools ``` #### 生成映像 确保当前目录下存在 `rootfs.cpio.gz` 文件,然后运行以下命令: ```bash mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d rootfs.cpio.gz u-rootfs ``` #### 验证生成的映像 运行命令后,如果没有报信息,说明映像生成成功。可以使用以下命令查看生成的映像文件信息: ```bash mkimage -l u-rootfs ``` ### 可能出现的问题及解决办法 - **`mkimage` 命令未找到**:这通常是因为 `mkimage` 工具未安装。可以按照上述安装指南进行安装。 - **输入文件 `rootfs.cpio.gz` 不存在**:检查当前目录下是否存在该文件,或者确认文件路径是否正确。 - **权限问题**:如果没有足够的权限创建输出文件,可能会导致生成失败。可以使用 `sudo` 命令以管理员权限运行 `mkimage` 命令。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武溪嵌人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值