在生成镜像的最后一步报告"invalid entry point -n"错误

openorz 发布于 2014/10/29 22:26
阅读 2K+
收藏 0

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

if [ -f linux-2.6.36.x/vmlinux ]; then \
        ln -f linux-2.6.36.x/vmlinux linux-2.6.36.x/linux ; \
    fi
[ -d /home/wdx/MTK_M7620/RT288x_SDK/source/images ] || mkdir /home/wdx/MTK_M7620/RT288x_SDK/source/images
make ARCH=mips CROSS_COMPILE="/opt/buildroot-gcc342/bin"/mipsel-linux- -C vendors image
make[1]: 正在进入目录 `/home/wdx/MTK_M7620/RT288x_SDK/source/vendors'
make -C /home/wdx/MTK_M7620/RT288x_SDK/source/vendors/Ralink/MT7620/. dir_v=/home/wdx/MTK_M7620/RT288x_SDK/source/vendors/Ralink/MT7620/. -f /home/wdx/MTK_M7620/RT288x_SDK/source/vendors/vendors-common.mak image
make[2]: 正在进入目录 `/home/wdx/MTK_M7620/RT288x_SDK/source/vendors/Ralink/MT7620'
/opt/buildroot-gcc342/bin/mipsel-linux-objcopy -O binary -R .note -R .comment -S /home/wdx/MTK_M7620/RT288x_SDK/source/linux-2.6.36.x/vmlinux  /home/wdx/MTK_M7620/RT288x_SDK/source/images/zImage
cd /home/wdx/MTK_M7620/RT288x_SDK/source/images ; rm -f /home/wdx/MTK_M7620/RT288x_SDK/source/images/zImage.*; lzma -9 -f -S .lzma /home/wdx/MTK_M7620/RT288x_SDK/source/images/zImage
/home/wdx/MTK_M7620/RT288x_SDK/source/vendors/Ralink/MT7620/mkimage: invalid entry point -n
make[2]: *** [image] 错误 1
make[2]:正在离开目录 `/home/wdx/MTK_M7620/RT288x_SDK/source/vendors/Ralink/MT7620'
make[1]: *** [image] 错误 2
make[1]:正在离开目录 `/home/wdx/MTK_M7620/RT288x_SDK/source/vendors'
make: *** [image] 错误 2

哪位大牛知道为何会产生这样的错误吗?

报告错误部分的源代码位于mkimage.c,相关程序如下所示(看样子是参数错误),但是我没有看懂

    int ifd;
    uint32_t checksum;
    uint32_t addr;
    uint32_t ep;
    uint32_t ksz=0;
    struct stat sbuf;
    unsigned char *ptr;
    char *name = "";

    cmdname = *argv;

    addr = ep = 0;

    while (--argc > 0 && **++argv == '-') {
        while (*++*argv) {
            switch (**argv) {
            case 'l':
                lflag = 1;
                break;
            case 'A':
                if ((--argc <= 0) ||
                    (opt_arch = get_arch(*++argv)) < 0)
                    usage ();
                goto NXTARG;
            case 'C':
                if ((--argc <= 0) ||
                    (opt_comp = get_comp(*++argv)) < 0)
                    usage ();
                goto NXTARG;
            case 'O':
                if ((--argc <= 0) ||
                    (opt_os = get_os(*++argv)) < 0)
                    usage ();
                goto NXTARG;
            case 'T':
                if ((--argc <= 0) ||
                    (opt_type = get_type(*++argv)) < 0)
                    usage ();
                goto NXTARG;

            case 'a':
                if (--argc <= 0)
                    usage ();
                addr = strtoul (*++argv, (char **)&ptr, 16);
                if (*ptr) {
                    fprintf (stderr,
                        "%s: invalid load address %s\n",
                        cmdname, *argv);
                    exit (EXIT_FAILURE);
                }
                goto NXTARG;
            case 'd':
                if (--argc <= 0)
                    usage ();
                datafile = *++argv;
                dflag = 1;
                goto NXTARG;
            case 'e':
                if (--argc <= 0)
                    usage ();
                ep = strtoul (*++argv, (char **)&ptr, 16);
                if (*ptr) {
                    fprintf (stderr,
                        "%s: invalid entry point %s\n",
                        cmdname, *argv);
                    exit (EXIT_FAILURE);
                }
                eflag = 1;
                goto NXTARG;
            case 'k':
                if (--argc <= 0)
                    usage ();
                ksz = (uint32_t)atoi(*++argv);
                goto NXTARG;
            case 'n':
                if (--argc <= 0)
                    usage ();
                name = *++argv;
                goto NXTARG;
            case 'v':
                vflag++;
                break;
            case 'x':
                xflag++;
                break;
            default:
                usage ();
            }
        }

加载中
0
openorz
openorz

引用来自“openorz”的评论

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

mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e 0x8000c310 -n "Linux Kernel Image"  -d /home/usrname/Documents/RT288x_SDK/source/images/zImage.lzma /home/usrname/Documents/RT288x_SDK/source/images/usrname_uImage

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

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

mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e -n "Linux Kernel Image"  -d /home/usrname/Documents/RT288x_SDK/source/images/zImage.lzma /home/usrname/Documents/RT288x_SDK/source/images/usrname_uImage

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就可以完成编译了。

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

0
openorz
openorz

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

mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e 0x8000c310 -n "Linux Kernel Image"  -d /home/usrname/Documents/RT288x_SDK/source/images/zImage.lzma /home/usrname/Documents/RT288x_SDK/source/images/usrname_uImage

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

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

mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e -n "Linux Kernel Image"  -d /home/usrname/Documents/RT288x_SDK/source/images/zImage.lzma /home/usrname/Documents/RT288x_SDK/source/images/usrname_uImage

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

返回顶部
顶部