大家好。 我目前正在尝试做的是将工具 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/