흔한 함정에 빠졌다..

리눅스 커널에서 C라이브러리를 사용하려고 했다. 바로 stdlib.h ...

아래는 웹서핑으로 발견한 글,..



얼마전 커널에서 동작하는 간단한 프로그램을 만들었다.
컴파일 하는데..앵.. 왠걸.. 엄청난 애러가 났다.

kernel/syscall_interpret/auditex_string.c:1:20: error: stdlib.h: No such file or directory

결론부터 말하면 kernel 에서는 stdlib 들을 사용할 수 없다.
standard library 는 glibc 에 연동되어서 돌아가는데, kernel 에서는 이를 이용할 수 없기 때문이다.
따라서 kernel 쪽에서는 이를 대비한 간단한 lib들을 따로 재공 하고 있는데 그 위치는 컴파일 환경마다 다르겠지만 보통 다음과 같다.

linux-버전명\lib



출처 http://decdream.tistory.com/63




해결방법은 아래와 같다

execute a shell command from kernel

Submitted by maat
on December 18, 2005 - 1:24am

hi,
i am trying to run a shell command from kernel with the function do_execve, but i get always the error "no a file or directory". follow is the code.
############# code #####################
char *cmd[]={//set the command to be use
/*"sh",*/
"-c",
"ls /",
NULL
};

char *env[]={ //set the environment
"HOME=/",
"PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/sawacom/bin",
"SHELL=/bin/bash",
"TERM=xterm",
NULL
};

struct pt_regs *regs;

int a= do_execve("sh", cmd, env, regs); //execute the shell command

printk("<1>##### a=%d #####\n",a);
################# end code ########################
perhaps someone can tell me what i am doing wrong.

thanks

tried with full path?

strcmp
on
December 18, 2005 - 3:06am

Like execve() in user space do_execve() may want the absolute path of the file to execute (execlp is not a syscall..). In your case "/bin/sh" instead of "sh". In fact, what the error "no a file or directory" says is exactly "you passed the wrong file name"...

Posted by cyj4369
,