错误,当我EXCUTE AIX内核扩展程序 [英] errors when I excute AIX kernel extension program
本文介绍了错误,当我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屋!
查看全文