gpt4 book ai didi

linux - 在/proc/kallsyms 中重复名称

转载 作者:太空宇宙 更新时间:2023-11-04 10:14:51 25 4
gpt4 key购买 nike

为什么/proc/kallsyms 中的某些符号会重复?例如:我看到 _acpi_module_name__this_modulecleanup_module.LC0 重复多次。

为什么会这样?为什么有这样的符号,一个名称解析为多个地址?我看到 __acpi_module_name 在/proc/kallsyms 中重复了 113 次。

最佳答案

这些是不同的情况。

对于_acpi_module_name,它们只是静态全局变量。静态全局变量或函数仅在声明它的文件中“可见”。它在 include/acpi/acoutput.h 中定义。

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

对于__this_module,它们定义在每个内核模块中,由script/mod/modpost添加。

 /**
* 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");
}

对于cleanup_module,定义在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

对于.LC0,它是编译器在不同源文件中生成的标签,如静态全局变量。

关于linux - 在/proc/kallsyms 中重复名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com