linux内核 动态内存分配malloc出错

wuhuiiii 2015-07-13 03:49:59
最近在写一个linux内核程序,其中要使用到动态内存分配,我使用的是malloc以及free;

但是,问题来了:

我添加了头文件#include <stdlib.h>, #include<malloc.h>, 运行的时候报错:

unresolved symbol malloc;
unresolved symbol free;
hint: You are trying to load a module without a GPL compatible and it has unresolved symbol.


其实上面两个头文件加与不加都是报上面的错。

请大家帮忙看看,谢谢!
...全文
597 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Buddy.Zhang 2015-08-09
请先准确描述你的问题,如你所说,如果是在内核模块编程的说,系统只会报“fatal error:stdio.h: No such file or direction”。确定编写的代码是内核代码。
回复
lr2131 2015-07-22
引用 楼主 wuhuiiii 的回复:
最近在写一个linux内核程序,其中要使用到动态内存分配,我使用的是malloc以及free; 但是,问题来了: 我添加了头文件#include <stdlib.h>, #include<malloc.h>, 运行的时候报错: unresolved symbol malloc; unresolved symbol free; hint: You are trying to load a module without a GPL compatible and it has unresolved symbol. 其实上面两个头文件加与不加都是报上面的错。 请大家帮忙看看,谢谢!
内核层是不能用malloc的,就如同内核层不能用printf,却可以用printk。 你调试时,有见到内核层用printf的吗。
回复
一个是用户态,一个是内核态,就相当于C中经常用到的printf(),在kernel里面是printk(),所以用户态的malloc对应的内核里面的应该是kmalloc,比如kmalloc(conf->scribble_len, GFP_KERNEL)。
回复
dag617712 2015-07-17
和C语言编译器不太一样?
回复
图灵转世 2015-07-17
malloc,free是glibc库的函数,glibc是用户态的c库。
回复
fly 100% 2015-07-17
编译器的C库应该没有用对 只能用kernel里的kmalloc
回复
ygt95 2015-07-17
我也遇到了同样的问题?
回复
wuhuiiii 2015-07-13
您好,谢谢您的回复。我把内核动态分配改成kmalloc();这其中有一个flag参数,需要用到#include<linux/gfp.h>这个头文件,可是加上之后又会报错无法识别这个头文件,不加的话又报错kmalloc参数过少
回复
tug 2015-07-13
kernel没有malloc实现,用内核的内存分配函数
回复
lucky-lucky 2015-07-13
malloc是属于用户态的函数。 linux通过系统调用将用户态和内核态完全的分割开,对于执行在用户空间下的程序进入内核态的唯一方式是使用系统调用。 我们编写的普通包含stdio.h的程序可编译通过的原因是glibc内实现了stdio.h当中提供的所有函数,包括malloc,当你在编译内核程序的时候gcc添加了-nostdlib选项,这导致其不会引用glibc的任何东西(静态库和动态库),所以才会报错。 malloc的实现实际上是调用了sys_brk系统调用。
回复
wuhuiiii 2015-07-13
你是说kmalloc是内核态的,malloc是用户态的是吗?
回复
wuhuiiii 2015-07-13
你好,不太明白你的意思?
回复
mmxopq 2015-07-13
这是用户态 用的吧
回复
wuhuiiii 2015-07-13
谢谢回复,可是为什么使用malloc会报错呢?
回复
shenyi0106 2015-07-13
linux 内核可以用kmalloc
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4152

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2015-07-13 03:49
社区公告
暂无公告