なぜ/ proc/kallsymsのシンボルが繰り返されるのですか?たとえば:私は、_acpi_module_name
、__this_module
、cleanup_module
、.LC0
が何度も繰り返すことを確認します。/proc/kallsymsの名前を繰り返す
どうしてですか?なぜ名前が複数のアドレスに解決されるようなシンボルがありますか?私は/ proc/kallsymsに__acpi_module_nameを113回繰り返しています。
なぜ/ proc/kallsymsのシンボルが繰り返されるのですか?たとえば:私は、_acpi_module_name
、__this_module
、cleanup_module
、.LC0
が何度も繰り返すことを確認します。/proc/kallsymsの名前を繰り返す
どうしてですか?なぜ名前が複数のアドレスに解決されるようなシンボルがありますか?私は/ proc/kallsymsに__acpi_module_nameを113回繰り返しています。
これは異なる場合です。
_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
で定義されています、それは静的なグローバル変数のような別のソース・ファイル内のコンパイラ生成されたラベルです。