Linux kernel 如何在内核模块中更改由EXPORT_符号导出的名称?

Linux kernel 如何在内核模块中更改由EXPORT_符号导出的名称?,linux-kernel,kernel,kernel-module,Linux Kernel,Kernel,Kernel Module,我有一组代码,它在模块mod导出的函数foo上传递。 我有一个较新版本的mod,它可以导出foo_实现。 foo在那里变成了一个宏 因此,问题是:如何表达EXPORT\u SYMBOL()将foo\u实现导出为foo? 如果可能的话,只需对代码进行最小的更改 比如说,改变一下可以吗 void foo_实现(int arg){…} 导出符号(foo_实现); 到 void foo_实现(int arg){…} 导出符号(foo_实现); #ifdef foo #undef foo #恩迪夫 vo

我有一组代码,它在模块
mod
导出的函数
foo
上传递。 我有一个较新版本的
mod
,它可以导出
foo_实现
foo
在那里变成了一个宏

因此,问题是:如何表达
EXPORT\u SYMBOL()
foo\u实现导出为
foo
如果可能的话,只需对代码进行最小的更改

比如说,改变一下可以吗

void foo_实现(int arg){…}
导出符号(foo_实现);

void foo_实现(int arg){…}
导出符号(foo_实现);
#ifdef foo
#undef foo
#恩迪夫
void foo(int arg){返回foo_实现(arg);}
出口标志(foo);

实际上,有两种方法:

  • 哈克,在问题中提出的。它以某种方式工作,允许您至少加载一个模块
  • 正常的一个:)只需重建不仅受影响的kmod,而且还受影响的整个代码集。这将使
  • #define正常工作,问题将自行解决,不会产生任何暴力
    void(*foo)(
    声明指向函数的指针。虽然调用
    foo()
    foo_实现()
    在语义上是等价的,但是符号
    foo
    foo_实现
    是不同的。此外,如果
    foo
    一直被定义为宏,则您的声明是不正确的
    我有一组代码,它依赖于模块mod导出的函数foo。
    -是否允许添加只调用
    foo实现()
    foo()
    的定义到该代码中?我希望是:)也就是说,你的意思是用
    void foo(){foo impl()}
    替换
    void foo(){foo impl()}
    ?我的意思是修改代码,它需要导出
    foo
    (换句话说,它使用
    foo
    ),而不是实际导出它的调用方。修复调用方太复杂了,因为有几个
    \define
    使用此
    foo
    ,我不确定我是否正确找到了所有调用方。因此,最好是修复被调用方,以提供调用方希望看到的入口点,并将此声明替换为
    void foo_实现(void);静态内联void foo(void){foo_implementation();}
    。修复导出符号也不是一件容易的任务。顺便说一句,宏
    EXPORT\u SYMBOL
    在中定义。