0

我有两个模块 A、B。A 有一个全局可访问的函数 f(),即导出了 f() 符号。B 可能想偶尔调用 f()。但是如果模块 A 被加载,B 应该只调用 f() 。B 判断 A 是否已加载的最佳方法是什么?

这个问题的 b 部分有没有办法检查 f() 是否被导出?

我不确定哪种方法更有效。

4

2 回答 2

1

我假设您首先加载模块 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);
}
于 2011-02-03T02:39:34.043 回答
0

如果 B 至少使用了 A 的一个符号,那么在加载 B 时,提供所需符号的模块(换句话说,像 A 这样的模块)也已经加载。

这个问题的 b 部分有没有办法检查 f() 是否被导出?

如果符号不可用,您将无法加载请求它的模块 (B)。

于 2011-02-03T02:06:02.123 回答