首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux设备驱动程序:找不到符号"memcpy“

Linux设备驱动程序:找不到符号"memcpy“
EN

Stack Overflow用户
提问于 2010-12-31 22:35:52
回答 6查看 6.4K关注 0票数 7

我正在试着写一个Linux设备驱动程序。在我尝试使用"memcpy“之前,我一直把它用得很好。我甚至没有得到一个编译器错误,当我"make“它只是警告我:

WARNING: "memcpy" [/root/homedir/sv/main.ko] undefined!

好的,当我尝试通过insmod加载时,我进入了控制台:

insmod: error inserting './main.ko': -1 Unknown symbol in module

在dmesg上:

main: Unknown symbol memcpy (err 0)

我包括以下内容:

代码语言:javascript
复制
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>

#include <linux/kernel.h> /* printk() */
#include <linux/slab.h>  /* kmalloc() */
#include <linux/fs.h>  /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t */
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/cdev.h>
#include <asm/system.h>  /* cli(), *_flags */
#include <asm/uaccess.h> /* copy_*_user */

使用memcpy的函数:

代码语言:javascript
复制
static int dc_copy_to_user(char __user *buf, size_t count, loff_t *f_pos, 
        struct sv_data_dev *dev)
{
    char data[MAX_KEYLEN];
    size_t i = 0;

    /* Copy the bulk as long as there are 10 more bytes to copy */
    while (i < (count + MAX_KEYLEN)) {
        memcpy(data, &dev->data[*f_pos + i], MAX_KEYLEN);
        ec_block(dev->key, data, MAX_KEYLEN);
        if (copy_to_user(&buf[i], data, MAX_KEYLEN)) {
            return -EFAULT;
        }
        i += MAX_KEYLEN;
     }

     return 0;
 }

有人能帮帮我吗?我以为它在linux/string.h .h中,但我得到的错误是一样的。我使用的是内核2.6.37-rc1 (我在user-mode-linux中运行,它只能从2.6.37-rc1开始工作)。任何帮助都是非常感谢的。

代码语言:javascript
复制
# Context dependent makefile that can be called directly and will invoke itself
# through the kernel module building system.
KERNELDIR=/usr/src/linux

ifneq ($(KERNELRELEASE),)

EXTRA_CFLAGS+=-I $(PWD) -ARCH=um
obj-m := main.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)

all:
 $(MAKE) V=1 ARCH=um -C $(KERNELDIR) M=$(PWD) modules

clean:
 rm -rf Module.symvers .*.cmd *.ko .*.o *.o *.mod.c .tmp_versions *.order

endif
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-05 04:51:06

我是在用户模式下做的-linux

你可以在没有用户模式Linux的情况下尝试一下吗?

内核不与libc链接,但UML是一个例外。这可以解释你的链接错误。

票数 2
EN

Stack Overflow用户

发布于 2010-12-31 23:29:39

字符串要么被定义为特定于arch的(如果是__HAVE_ARCH_MEMCPY的),要么被定义为lib/ memcpy中的通用版本。在任何一种情况下,它都应该是可用的。查看/proc/kallsyms,使用objdump检查您的模块,同时验证符号版本控制没有把事情搞砸。

票数 1
EN

Stack Overflow用户

发布于 2010-12-31 23:52:14

第一点是,这是一个链接错误,而不是编译错误。实际上,这是一个动态链接问题。你的模块编译得很好,尽管有一个警告。只有当你加载它的时候,它才会失败。所以这与头文件无关。第二点是,memcpy在内核中被定义和广泛使用,所以没有理由找不到memcpy符号。

原因可能很简单,就是GCC本身的问题。GCC使用内置函数,其中一些函数可能引用了内核中没有的libgcc。如果是这种情况,则可以使用编译器选项-fno-builtin解决此问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4570637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档