错误,当我EXCUTE AIX内核扩展程序 [英] errors when I excute AIX kernel extension program

查看:440
本文介绍了错误,当我EXCUTE AIX内核扩展程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在AIX林新手。
我当我编译的内核扩展许多错误。
在此之后,我终于编译和链接。

不过,当我excuted二进制,我得到这个错误。

 的bash#./sysconfig_1负荷./question.exp
无法加载程序./sysconfig_1:
        该方案不具有的入口点或
           在辅助haeder的o_snentry字段是无效的。
检查文件头的'倾倒-ohv命令

谁能帮助我?

  // sysconfig_1.c
#包括LT&; SYS / types.h中>
#包括LT&; SYS / sysconfig.h>
#包括LT&; SYS / device.h中>
#包括LT&; SYS / errno.h中>主(INT ARGC,CHAR *的argv [])
{
    结构cfg_load CL;
    结构cfg_kmod CK;
    INT RC;
    INT行为= -1;
    如果(ARGC == 3)
    {
        如果((STRCMP(的argv [1],负荷))== 0)
            ACT = SYS_KLOAD;
        否则,如果(STRCMP(的argv [1],卸载)== 0)
            ACT = SYS_KULOAD;
    }    如果(行为== -1)
    {
        输出(用法:%s的负载|卸<&KMOD GT; \\ N,argv的[0]);
        出口(1);
    }    cl.path =的argv [2];
    cl.libpath = NULL;    如果(行为== SYS_KLOAD)
    {
        / *加载内核模块* /
        RC = sysconfig中(SYS_KLOAD,&安培; CL,的sizeof(结构cfg_load));
        如果(RC == CONF_SUCC)
            的printf(kload返回%D,KMID =%X \\ n,RC,cl.kmid);
        其他
            的printf(kload返回%D,错误号=%d个\\ N,RC); //错误号);        如果((RC == CONF_SUCC)及&放大器;!(cl.kmid = 0))
        {
            / *
             *调用入口点(KMOD)或配置例行程序(DD)
             *为内核扩展与CFG_INIT参数。
             * /
            ck.kmid = cl.kmid;
            ck.cmd = CFG_INIT;
            RC = sysconfig中(SYS_CFGKMOD,&安培; CK,的sizeof(结构cfg_kmod));
            如果(RC == CONF_SUCC)
                的printf(cfgkmod返回%D,KMID =%X \\ n,RC,cl.kmid);
            其他
                的printf(cfgkmod返回%D,错误号=%d个\\ N,RC); //错误号);
        }
    }其他{
        / *查询,以确定是否内核模块被加载。 * /
        RC = sysconfig中(SYS_QUERYLOAD,&安培; CL,的sizeof(结构cfg_load));
        如果(RC == CONF_SUCC)
            的printf(queryload返回%D,KMID =%X \\ n,RC,cl.kmid);
        其他
            的printf(queryload返回%D,错误号=%X \\ n,RC); //错误号);        如果((RC == 0)及&放大器;!(cl.kmid = 0))
        {
            / *
             *调用入口点(KMOD)或配置例行程序(DD)
             *为内核扩展与CGW_TERM参数。
             * /
            ck.kmid = cl.kmid;
            ck.cmd = CFG_TERM;
            ck.mdiptr = 0;
            ck.mdilen = 0;
            RC = sysconfig中(SYS_CFGKMOD,&安培; CK,的sizeof(结构cfg_kmod));
            如果(RC == CONF_SUCC)
                的printf(cfgkmod返回%D,KMID =%X \\ n,RC,cl.kmid);
            其他
            {
                的printf(cfgkmod返回%D,错误号=%d个\\ N,RC); //错误号);
                出口(RC);
            }
            / *取消配置内核模块。 * /
            RC = sysconfig中(SYS_KULOAD,&安培; CL,的sizeof(结构cfg_load));
            如果(RC == CONF_SUCC)
                的printf(卸载返回%D,KMID =%X \\ n,RC,cl.kmid);
            其他
                的printf(卸载返回%D,错误号=%d个\\ N,RC); //错误号);
        }
    }
    出口(RC);
}//question.c
#包括LT&;&stdio.h中GT;
#包括LT&; SYS / device.h中>
question_init(INT CMD,结构UIO * UIO)
{
    开关(CMD){
        案例CFG_INIT:{
            的printf(question_init:命令= CFW_INIT \\ n);
            打破;
            }
        案例CFG_TERM:{
            的printf(question_init:命令= CFG_TERM \\ n);
            打破;
            }
        默认:
            的printf(question_init:命令=%d个\\ N,CMD);
    }
    返回0;
}题()
{
    返回42;
}

我编这个样子。我怎么误解?

 的bash#GCC -D_KERNEL -Wall -g -pipe -maix64 -ffreestanding -msoft浮动-c sysconfig_1.c
庆典#GCC -D_KERNEL -Wall -g -pipe -maix64 -ffreestanding -msoft浮动-c question.c
庆典#的/ usr / bin中/ LD -o sysconfig_1 -b64 -K -bI:/usr/lib/kernex.exp -lsys -lcsys -lc_r sysconfig_1.o


解决方案

您的程序不打算在独立环境中运行,所以我想这是在 -ffreestanding 选项引起该问题。在功能显然是考虑一个普通的功能,而不是一个切入点。

Im newbie at AIX. I got many errors when I compiled kernel extension. After then, finally I compiled and Linked.

But When I excuted the binary, I got this error.

bash# ./sysconfig_1 load ./question.exp
Could not load program ./sysconfig_1:
        The program does not have an entry point or 
           the o_snentry field in the auxiliary haeder is invalid.
Examine file headers with the 'dump -ohv' command

Could anyone help me?

//sysconfig_1.c
#include <sys/types.h>
#include <sys/sysconfig.h>
#include <sys/device.h>
#include <sys/errno.h>

main(int argc, char *argv[])
{
    struct cfg_load cl;
    struct cfg_kmod ck;
    int rc;
    int act = -1;
    if (argc == 3)
    {
        if ((strcmp(argv[1], "load")) == 0)
            act = SYS_KLOAD;
        else if (strcmp(argv[1], "unload") == 0)
            act = SYS_KULOAD;
    }

    if (act == -1)
    {
        printf("usage: %s load|unload <kmod>\n, argv[0]");
        exit(1);
    }

    cl.path =argv[2];
    cl.libpath = NULL;

    if (act == SYS_KLOAD)
    {
        /* Load Kernel Module */
        rc = sysconfig(SYS_KLOAD, &cl, sizeof(struct cfg_load));
        if (rc == CONF_SUCC)
            printf("kload returns %d, kmid = %x\n", rc, cl.kmid);
        else
            printf("kload returns %d, errno = %d\n", rc); //, errno);

        if ((rc == CONF_SUCC) && (cl.kmid != 0))
        {
            /*
             * Invoke entry point (kmod) or config routine (dd)
             * for kernel extension with CFG_INIT parameter.
             */
            ck.kmid = cl.kmid;
            ck.cmd = CFG_INIT;
            rc = sysconfig(SYS_CFGKMOD, &ck, sizeof(struct cfg_kmod));
            if (rc == CONF_SUCC)
                printf("cfgkmod returns %d, kmid = %x\n", rc, cl.kmid);
            else 
                printf("cfgkmod returns %d, errno = %d\n", rc); // , errno);
        }
    } else {
        /* Query to determine if kernel module is loaded. */
        rc = sysconfig(SYS_QUERYLOAD, &cl, sizeof(struct cfg_load));
        if (rc == CONF_SUCC)
            printf("queryload returns %d, kmid = %x\n", rc, cl.kmid);
        else
            printf("queryload returns %d, errno = %x\n", rc); // , errno);

        if ((rc == 0) && (cl.kmid != 0))
        {
            /*
             * Invoke entry point (kmod) or config routine (dd)
             * for kernel extension with CGW_TERM parameter.
             */
            ck.kmid = cl.kmid;
            ck.cmd = CFG_TERM;
            ck.mdiptr = 0;
            ck.mdilen = 0;
            rc = sysconfig(SYS_CFGKMOD, &ck, sizeof(struct cfg_kmod));
            if (rc == CONF_SUCC)
                printf("cfgkmod returns %d, kmid =%x\n", rc, cl.kmid);
            else
            {
                printf("cfgkmod returns %d, errno =%d\n, rc); //, errno");
                exit(rc);
            }
            /* Unconfigure kernel module. */
            rc = sysconfig(SYS_KULOAD, &cl, sizeof(struct cfg_load));
            if (rc == CONF_SUCC)
                printf("unload returns %d, kmid =%x\n", rc, cl.kmid);
            else
                printf("unload returns %d, errno =%d\n", rc); // , errno);
        }
    }
    exit(rc);
}

//question.c
#include <stdio.h>
#include <sys/device.h>
question_init(int cmd, struct uio *uio)
{
    switch(cmd) {
        case CFG_INIT: {
            printf("question_init: command=CFW_INIT \n");
            break;
            } 
        case CFG_TERM: {
            printf("question_init:command=CFG_TERM \n");
            break;
            }
        default:
            printf("question_init:command=%d\n", cmd);
    }
    return 0;
}

question()
{
    return 42;
}

I compiled like this. what did I misunderstand?

bash# gcc -D_KERNEL -Wall -g -pipe -maix64 -ffreestanding -msoft-float -c sysconfig_1.c
bash# gcc -D_KERNEL -Wall -g -pipe -maix64 -ffreestanding -msoft-float -c question.c
bash# /usr/bin/ld -o sysconfig_1 -b64 -K -bI:/usr/lib/kernex.exp -lsys -lcsys -lc_r sysconfig_1.o

解决方案

Your program is not intended to run in a freestanding environment, so I guess it's the -ffreestanding option that causes the problem. The main function is apparently considered an ordinary function, not an entry point.

这篇关于错误,当我EXCUTE AIX内核扩展程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆