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

标签 c linux module kernel porting

大家好。 我目前正在尝试做的是将工具 DigSig 移植到 CentOS 内核,它似乎缺少一些重要的 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 涵盖了所有内容,所以我无法理解他为什么要多次定义此函数... 有什么想法吗?

最佳答案

您的包含文件被包含在多个地方。 这不是编译时错误。而是链接时间错误。 您的每个文件都在 .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 中添加声明)。

关于c - 内核文件中函数错误的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140921/

相关文章:

c++ - openssl:减少内存使用

C 相当于 Java 静态 block (启动时运行一次)

windows - 我应该在什么操作系统上托管颠覆?

java - 无法使用processBuilder执行linux命令

c - 这段代码有什么不同

linux - 如何使用存储在单个变量中的引号传递命令行参数?

string - 如何在ocaml中导入和使用新模块?

php - 如何做一个PHP钩子(Hook)系统?

python - 如何组织用于可分发 Python 模块的目录?

c++ - 将静态 C 库与 C++ 代码链接时出现 "undefined reference to"错误