我正在尝试为RHEL 5.6编译第三方内核模块,但由于函数名与mutex_acquire
和mutex_release
冲突而失败。这个内核模块在RHEL 4.7上完全编译,因此内核2.6.9和2.6.18之间发生了变化。遗憾的是,供应商不再支持此内核模块,但我确实有mutex.c
和mutex.h
的源代码来定义这些函数。不幸的是,有一个目标文件nivxi.o
没有分发源代码,而且这个目标文件正在调用mutex_acquire
和mutex_release
所以我不能简单地改变它们的名字。
顺便说一下,我最初试图稍微修改名称,编译错误消失但是当它去制作.ko内核模块时,它抱怨它找不到mutex_acquire
或{{1 }};可能是由于mutex_release
如何强制编译器/链接器使用本地.c / .h文件中的函数定义,即使它们在其他地方遇到类似命名的函数?
nivxi.o
NIVXICC void mutex_acquire(mutex_t *mutex);
NIVXICC void mutex_release(mutex_t *mutex);
#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
答案 0 :(得分:3)
问题不在您的目标文件中,因为宏具有文件范围并被预处理器替换。因此,在编译之后,就nivxi.o
文件而言,宏不再存在。
问题可能在您的mutex.h
文件中。我会查看顶部,您可能会看到#include <lockdep.h>
行。因此,一旦预处理器进入函数定义,它就会将mutex_acquire
视为要替换的标记(使用错误的参数数量)。
解决问题的最简单方法是在#undef mutex_acquire
开头#undef mutex_release
和mutex.h
。这将阻止预处理器替换mutex.h
中的标记。由于定义具有文件范围,因此您无需担心这种传播超出了应用程序