我有两个模块 A、B。A 有一个全局可访问的函数 f(),即导出了 f() 符号。B 可能想偶尔调用 f()。但是如果模块 A 被加载,B 应该只调用 f() 。B 判断 A 是否已加载的最佳方法是什么?
这个问题的 b 部分有没有办法检查 f() 是否被导出?
我不确定哪种方法更有效。
我有两个模块 A、B。A 有一个全局可访问的函数 f(),即导出了 f() 符号。B 可能想偶尔调用 f()。但是如果模块 A 被加载,B 应该只调用 f() 。B 判断 A 是否已加载的最佳方法是什么?
这个问题的 b 部分有没有办法检查 f() 是否被导出?
我不确定哪种方法更有效。
我假设您首先加载模块 B,然后可选地加载模块 A。我的策略是让 A 在 A 首次初始化时向 B 注册一组函数。B 保留一个静态分配的函数指针(或指向一个充满函数指针的结构的指针),并提供导出的函数来注册和注销处理程序。当 A 加载时,它向 B 注册其函数(或函数结构)。当 A 卸载时,它取消注册其函数。
它可能是这样的:
溴化氢
typedef int (*foo_t)(int);
int B_register_foo(foo_t);
int B_unregister_foo(foo_t);
公元前
static foo_t foo = NULL;
int B_register_foo(foo_t f) {
if (!foo) {
foo = f;
return 0;
}
return -EFOO;
}
void B_unregister_foo(foo_t f) {
if (foo == f)
foo = NULL;
}
EXPORT_SYMBOL(B_register_foo);
EXPORT_SYMBOL(B_unregister_foo);
void B_maybe_call_foo(int arg) {
return (foo) ? foo(arg) : 0;
}
交流电
static int A_foo(int arg);
static int __init init_A(void) {
if (B_register_foo(A_foo))
return -EFOO;
return 0;
}
static void __exit exit_A(void) {
B_unregister_foo(A_foo);
}
如果 B 至少使用了 A 的一个符号,那么在加载 B 时,提供所需符号的模块(换句话说,像 A 这样的模块)也已经加载。
这个问题的 b 部分有没有办法检查 f() 是否被导出?
如果符号不可用,您将无法加载请求它的模块 (B)。