参照元†
- モジュールのバージョン管理をサポートするため、
関数や変数の CRC 値(バージョンとして使う)を入れるシンボルを宣言する。
- CRC はコンパイル時に計算されるようだが、詳細は不明です。
- バージョン情報テーブルの先頭要素は __start___kcrctab というシンボルである。
返り値†
#ifndef __GENKSYMS__
- __GENKSYMS__ が宣言されていないときに有効である。
#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 \
__used \
- 最適化で消されないようにする。「未使用の変数/関数です」警告を抑制する。
__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 値を入れた変数へのポインタが得られる。
#else
#define __CRC_SYMBOL(sym, sec)
- CONFIG_MODVERSIONS が宣言されていない場合は何もしない。
- このマクロはカーネルのコンフィグで module versioning を ON にすると
宣言される。
#endif
コメント†