drm_of.c中的drm_of_component_match_add可以生成在System.map,但是drm_of_lvds_get_dual_link_pixel_order也使用了EXPORT_SYMBOL为什么不能生成是为什么
时间: 2023-09-18 17:10:07 浏览: 158
EXPORT_SYMBOL 用于指定一个符号可以被外部模块访问,但是它并不会生成在 System.map 文件中。System.map 文件主要记录内核符号表,即内核中所有可导出符号的地址信息。在内核启动时,System.map 文件会被读取,以方便调试和排错。
在 Linux 内核中,可导出符号被定义为带有 EXPORT_SYMBOL 或 EXPORT_SYMBOL_GPL 宏的全局函数或变量。当内核模块需要链接到这些符号时,它们会被自动加载到内核空间中。
因此,如果你需要在 System.map 文件中记录一个符号的地址信息,你需要在内核配置选项中启用 CONFIG_KALLSYMS,并重新编译内核。启用该选项后,内核会生成一个 System.map 文件,其中包含所有已导出符号的地址信息。
相关问题
drm_of.c中的drm_of_component_match_add可以生成在System.map但是drm_of_lvds_get_dual_link_pixel_order不能生成是为什么
System.map 是 Linux 内核编译后生成的符号表,包含了内核中所有可导出的符号和其对应的地址。在驱动模块中,如果一个函数需要在符号表中导出,需要使用 EXPORT_SYMBOL 宏来标记。
对于不同的符号,是否在 System.map 中出现取决于它们在内核中是否被导出。如果一个函数或变量没有被导出,它在 System.map 中就不会出现。
在你提到的情况中,`drm_of_component_match_add` 函数可以生成在 System.map 中,说明它在内核中被导出。而 `drm_of_lvds_get_dual_link_pixel_order` 函数没有生成在 System.map 中,可能是因为它没有被导出。你可以在代码中查找该函数是否使用了 EXPORT_SYMBOL 宏,如果没有使用,可以添加该宏将其导出。
已经在defcong里配置了编译drm_of.c,并且drm_of.c里已经配置了EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order)但是vmlinux.symvers并没更新drm_of_lvds_get_dual_link_pixel_order
如果你已经在drm_of.c中正确地使用了EXPORT_SYMBOL_GPL()宏来导出drm_of_lvds_get_dual_link_pixel_order函数,并且在Kconfig文件中启用了相关的选项,但是vmlinux.symvers文件仍然没有包含该符号,可能是因为编译内核时没有正确地生成symvers文件。
你可以尝试以下方法:
1. 确认你在编译内核时使用了CONFIG_MODVERSIONS选项。如果没有启用该选项,编译器将不会生成vmlinux.symvers文件。
2. 确认你的内核配置文件中启用了CONFIG_MODVERSIONS选项。你可以通过执行命令"grep CONFIG_MODVERSIONS .config"来检查。
3. 如果你已经确认启用了CONFIG_MODVERSIONS选项,但是vmlinux.symvers文件仍然没有包含drm_of_lvds_get_dual_link_pixel_order符号,那么可以尝试手动生成vmlinux.symvers文件。你可以执行以下命令:
```
make -C /lib/modules/$(uname -r)/build/ modules_prepare
make -C /lib/modules/$(uname -r)/build/ M=/path/to/your/kernel/module/directory/ modules
```
这将在你的内核模块目录中生成Module.symvers文件,它包含了所有导出的符号及其版本信息。你可以将该文件重命名为vmlinux.symvers并将其复制到你的内核源代码目录中。
请注意,如果你的内核版本发生了变化,你需要重新执行上述命令以更新vmlinux.symvers文件。
阅读全文