内核文件中函数错误的多重定义

时间:2011-02-28 10:41:54

标签: c linux module kernel porting

嘿伙计们。 我目前要做的是将DigSig工具移植到CentOS-Kernel,这似乎缺少一些DigSig的重要加密函数。 所以端口这个我只是一个更新的/linux/crypto.h,它具有我需要的功能,而且我添加了这个小代码:

void kzfree(const void *p) {
    size_t ks;
    void *mem = (void *)p;

    if (unlikely(ZONP(mem)))
             return;
    ks = ksize(mem);
    memset(mem, 0, ks);
    kfree(mem);

}

因为我正在研究的内核还没有kzfree。 现在,当我尝试编译DigSig时,这是输出:

/home/Chris/dsTest/dsi_sysfs.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_cache.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_revocation.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/dsi_sig_verify.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here

当然,所有内容都被#ifndef-Guards所覆盖,所以我无法理解为什么他多次定义这个函数... 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的包含文件包含在多个位置。 这不是编译时错误。而是一个链接的时间错误。 您的每个文件都是在.o文件

之后编译和生成的
/home/Chris/dsTest/dsi_sysfs.o
/home/Chris/dsTest/digsig_cache.o
/home/Chris/dsTest/digsig_revocation.o
/home/Chris/dsTest/dsi_sig_verify.o

现在将它们链接在一起时,它会找到kzfreez的多个定义,在上面的.o文件中各有一个,因为它们包含相应的c文件

/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h

你有ifdef保护文件,但这只会阻止.h文件包含在同一个c文件(翻译单元)中,而不是在不同的c文件中。

您应该在c文件中编写该函数并添加make文件,以便单独编译并链接。并且只在crypto.h中添加声明。 (对于测试,您可以在crypto.c中添加定义并在crypto.h中添加声明。)