#freeze *参照元 [#tc694da8] #backlinks *説明 [#d98596fe] -パス: [[linux-2.6.25/include/linux/module.h]] -モジュールのバージョン管理をサポートするため、 関数や変数の CRC 値(バージョンとして使う)を入れるシンボルを宣言する。 --CRC はコンパイル時に計算されるようだが、詳細は不明です。 --バージョン情報テーブルの先頭要素は __start___kcrctab というシンボルである。 **引数 [#y452095b] -sym --CRC を計算する対象となるシンボルを指定する。 -sec --セクションに追記する文字列を指定する。 **返り値 [#p5e6d7e0] -なし **参考 [#gb0a2eee] #ifndef __GENKSYMS__ -__GENKSYMS__ が宣言されていないときに有効である。 --[[linux-2.6.25/__GENKSYMS__]] *実装 [#nac1271b] #ifdef CONFIG_MODVERSIONS /* Mark the CRC weak since genksyms apparently decides not to * generate a checksums for some symbols */ #define __CRC_SYMBOL(sym, sec) \ extern void *__crc_##sym __attribute__((weak)); \ -CRC を格納するシンボルを宣言する。 --weak シンボルとして宣言する。 --## はトークン連結演算子で、トークン同士を繋いで一つのトークンにする。 (例: __CRC_SYMBOL(hoge, "") なら __crc_hoge となる) static const unsigned long __kcrctab_##sym \ -CRC 格納用の変数を宣言する。 __used \ -最適化で消されないようにする。「未使用の変数/関数です」警告を抑制する。 --古い gcc 用に使う。 __attribute__((section("__kcrctab" sec), unused)) \ -セクション __kcrctab に入れる。 -- --__attribute__( (unused) ) なのは __attribute__( (used) ) が変数に使えない 古い gcc のため(gcc < 3.4)らしい。 = (unsigned long) &__crc_##sym; -__crc_##sym へのポインタを __kcrctab_##sym と言う 名前で__kcrctab セクション(CRC 用のシンボルテーブル)に入れる。 -このセクションを見れば CRC 値を入れた変数へのポインタが得られる。 --セクションを探してくる関数、セクションからバージョンを取り出すマクロもある。 --[[linux-2.6.25/find_sec()]] --[[linux-2.6.25/symversion()]] #else #define __CRC_SYMBOL(sym, sec) -CONFIG_MODVERSIONS が宣言されていない場合は何もしない。 --このマクロはカーネルのコンフィグで module versioning を ON にすると 宣言される。 #endif *コメント [#p94a1c5a]