从vmlinux二进制文件中打印所有符号信息

时间:2014-07-14 21:58:15

标签: c linux-kernel elf symbols dwarf

由于以前存在很多混淆,所以我在这里重新提出一个问题。

我想打印vmlinux架构power-pc二进制文件中的所有符号信息 - staticdynamic(.so)以及包含kallsyms (module symbols)和其他任何内容的运行时间其他如果我不知道。

我对使用actually I can not and its difficult to explain here whyGDBreadelf/proc/kallsyms或获取system.map感兴趣(core file)。

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

据我所知,:

  1. 使用libelf/libdwarf获取所有静态信息。
  2. 需要为动态.so文件解析
  3. rld_map部分。
  4. 对于kallsyms,我不知道如何处理将动态添加的LKM的符号信息。
  5. 考虑到上述情况,请建议我从头开始编写工具是明智的决定。我现在可以使用libdwarf获取所有函数名称及其地址的列表。

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

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

    谢谢!!

1 个答案:

答案 0 :(得分:0)

如果您自己构建了内核,默认情况下应该创建一个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

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