2017-10-23 15 views
0

なぜ/ proc/kallsymsのシンボルが繰り返されるのですか?たとえば:私は、_acpi_module_name__this_modulecleanup_module.LC0が何度も繰り返すことを確認します。/proc/kallsymsの名前を繰り返す

どうしてですか?なぜ名前が複数のアドレスに解決されるようなシンボルがありますか?私は/ proc/kallsymsに__acpi_module_nameを113回繰り返しています。

答えて

1

これは異なる場合です。

_acpi_module_nameの場合は、静的なグローバル変数です。静的なグローバル変数または関数は、宣言されたファイル内でのみ「見られる」。include/acpi/acoutput.hで定義されている。 __this_moduleについて

#define ACPI_MODULE_NAME(name)   static const char ACPI_UNUSED_VAR _acpi_module_name[] = name; 

、それらはscript/mod/modpostによって追加されたすべてのカーネルモジュールで定義されています。 cleanup_moduleについては

/** 
* Header for the generated file 
**/ 
static void add_header(struct buffer *b, struct module *mod) 
{ 
     buf_printf(b, "#include <linux/module.h>\n"); 
     buf_printf(b, "#include <linux/vermagic.h>\n"); 
     buf_printf(b, "#include <linux/compiler.h>\n"); 
     buf_printf(b, "\n"); 
     buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); 
     buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); 
     buf_printf(b, "\n"); 
     buf_printf(b, "__visible struct module __this_module\n"); 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n"); 
     buf_printf(b, "\t.name = KBUILD_MODNAME,\n"); 
     if (mod->has_init) 
       buf_printf(b, "\t.init = init_module,\n"); 
     if (mod->has_cleanup) 
       buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n" 
           "\t.exit = cleanup_module,\n" 
           "#endif\n"); 
     buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n"); 
     buf_printf(b, "};\n"); 
} 

が、それは.LC0についてinclude/linux/module.h

#define module_exit(exitfn)          \ 
     static inline exitcall_t __maybe_unused __exittest(void)    \ 
     { return exitfn; }          \ 
     void cleanup_module(void) __attribute__((alias(#exitfn))); 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

#endif 

で定義されています、それは静的なグローバル変数のような別のソース・ファイル内のコンパイラ生成されたラベルです。

関連する問題