如何在编译内核模块时解决函数名冲突

时间:2011-02-15 08:40:10

标签: c linux-kernel kernel kernel-module

我正在尝试为RHEL 5.6编译第三方内核模块,但由于函数名与mutex_acquiremutex_release冲突而失败。这个内核模块在RHEL 4.7上完全编译,因此内核2.6.9和2.6.18之间发生了变化。遗憾的是,供应商不再支持此内核模块,但我确实有mutex.cmutex.h的源代码来定义这些函数。不幸的是,有一个目标文件nivxi.o没有分发源代码,而且这个目标文件正在调用mutex_acquiremutex_release所以我不能简单地改变它们的名字。

顺便说一下,我最初试图稍微修改名称,编译错误消失但是当它去制作.ko内核模块时,它抱怨它找不到mutex_acquire或{{1 }};可能是由于mutex_release

如何强制编译器/链接器使用本地.c / .h文件中的函数定义,即使它们在其他地方遇到类似命名的函数?

mutex.h

nivxi.o

nivxicc.h(只是这是相关的)

NIVXICC void mutex_acquire(mutex_t *mutex);
NIVXICC void mutex_release(mutex_t *mutex);

/usr/include/lockdep.h(冲突的定义)

#ifndef NIVXICC_H
#define NIVXICC_H
#define NIVXICC __attribute__((regparm(0))) __attribute__((cdecl))
#endif

错误

#ifdef CONFIG_DEBUG_LOCK_ALLOC
# ifdef CONFIG_PROVE_LOCKING
#  define mutex_acquire(l, s, t, i)             lock_acquire(l, s, t, 0, 2, i)
# else
#  define mutex_acquire(l, s, t, i)             lock_acquire(l, s, t, 0, 1, i)
# endif
# define mutex_release(l, n, i)                 lock_release(l, n, i)
#else
# define mutex_acquire(l, s, t, i)              do { } while (0)
# define mutex_release(l, n, i)                 do { } while (0)
#endif

1 个答案:

答案 0 :(得分:3)

问题不在您的目标文件中,因为宏具有文件范围并被预处理器替换。因此,在编译之后,就nivxi.o文件而言,宏不再存在。

问题可能在您的mutex.h文件中。我会查看顶部,您可能会看到#include <lockdep.h>行。因此,一旦预处理器进入函数定义,它就会将mutex_acquire视为要替换的标记(使用错误的参数数量)。

解决问题的最简单方法是在#undef mutex_acquire开头#undef mutex_releasemutex.h。这将阻止预处理器替换mutex.h中的标记。由于定义具有文件范围,因此您无需担心这种传播超出了应用程序