gpt4 book ai didi

c - 打印 vmlinux 二进制文件中的所有符号信息

转载 作者:行者123 更新时间:2023-11-30 17:31:11 28 4
gpt4 key购买 nike

由于之前有很多困惑,所以我在这里重新表述问题,删除旧问题。

我想打印 power-pc 架构上 vmlinux 二进制文件的所有符号信息 - static, dynamic(.so ) 以及运行时,包括 kallsyms(模块符号) 以及我不知道的任何其他内容。

我对使用 GDBreadelf 不感兴趣(实际上我不能,也很难在这里解释原因)/proc/kallsymssystem.map 或获取核心文件

我更想知道 GDB、readelf、objdump、kallsyms 或 systme.map 是如何生成的。他们使用哪些内核数据结构?他们更喜欢使用哪个库 - libelflibdwarf

据我了解:

  1. 使用 libelf/libdwarf 获取所有静态信息。
  2. rld_map 部分需要解析动态 .so 文件。
  3. 对于 kallsyms,我不确定如何处理动态添加的 LKM 的符号信息。

考虑到上述情况,请建议我从头开始编写该工具是否是明智的决定。我现在可以使用 libdwarf 获取所有函数名称及其地址的列表。

有人可以指导我找到一些最适合在上述情况下使用的源代码,或者可以针对上述场景进行一些修改,而不是从头开始编写一些内容,否则实际上是不可能的。 (可能是 readelf/objdump/GDB 的一些片段)

如果需要,请要求澄清和更新。

谢谢!!

最佳答案

如果您自己构建了内核,默认情况下应该创建一个 System.map 文件。另外,从内核源代码中,您可以检查脚本 /usr/src/linux/scripts/mksysmap ,它可用于创建 system.map scritp

或者,使用nm -A vmlinux 命令:

vmlinux:ffffffff81c8d960 d aa_fs_entry_features
vmlinux:ffffffff81c8dbc0 d aa_fs_entry_file
vmlinux:ffffffff81c8da80 d aa_fs_entry_policy
vmlinux:ffffffff81c8e300 D aa_fs_entry_rlimit
vmlinux:ffffffff813179a0 T __aa_fs_namespace_mkdir

第三列中的输出提供了程序加载到内存时符号所在位置的详细信息。“B”或“b”符号位于未初始化数据部分(称为BSS)。“T”或“t”符号位于文本(代码)部分。“U”符号未定义。

关于c - 打印 vmlinux 二进制文件中的所有符号信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746704/

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