web-dev-qa-db-ja.com

Linuxカーネルコードの「EXPORT_SYMBOL」の意味は何ですか?

from ここ

 48 struct snd_card *snd_cards[SNDRV_CARDS];
 49 EXPORT_SYMBOL(snd_cards);

私はそれが何を意味するのか、なぜそれが使われるのかを得ていません。私はそれについて検索しようとしましたが、その意味を理解していませんでした。

36
Jeegar Patel

動的にロードされたモジュールからシンボルにアクセスできるようにします(モジュールがextern宣言を追加する場合)。

少し前まで、 誰かがそれの使い方を尋ねました

40
cnicutar

それ自体は答えではなく、私のコメントから約束されているように、シンボルをエクスポートするデモンストレーションでしたではない非静的である必要があります。以下の2つのモジュールはこれを示しています。

/* mod1.c */
#include <linux/module.h>

static int mod1_exp_func(int i)
{
    pr_info("%s:%d the value passed in is %d\n",
            __func__, __LINE__, i);

    return i;
}
EXPORT_SYMBOL(mod1_exp_func); /* export static symbol */

static int __init mod1_init(void)
{
    pr_info("Initializing simple mod\n");
    return 0;
}

static void __exit mod1_exit(void)
{
    pr_info("This module is exiting\n");
}

module_init(mod1_init);
module_exit(mod1_exit);
MODULE_LICENSE("GPL v2");

そして2番目のモジュール

/* mod2.c */
#include <linux/module.h>

extern int mod1_exp_func(int);

static int __init mod2_init(void)
{
    pr_info("Initializing mod2\n");
    pr_info("Calling exported function in mod1\n");
    mod1_exp_func(3);
    return 0;
}

static void __exit mod2_exit(void)
{
    pr_info("mod2 exiting\n");
}

module_init(mod2_init);
module_exit(mod2_exit);
MODULE_LICENSE("GPL v2");

これらはCentOS 6およびCentOS 7でテストされました:カーネル2.6.32および3.10(それぞれ)。 mod1.koをロードしてからmod2.koをロードすると、mod1_exp_func()に渡される値がカーネルログバッファーに出力されます。

5
Andrew Falanga