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



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

我想在power-pc架构上打印vmlinux二进制中的所有符号信息- static, dynamic(.so)以及运行时间,包括kallsyms (module symbols)和任何其他,如果我不知道的话。

我对使用GDB, readelf, /proc/kallsymssystem.map或获得core file不感兴趣(actually I can not and its difficult to explain here why)。

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

我的理解是:

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

考虑到上述情况,请告诉我从头开始编写工具是否明智。我现在能够使用libdwarf获得所有函数名称和它们的地址的列表。

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

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

谢谢! !

如果您自己构建了内核,默认情况下这应该创建一个System.map文件。您还可以从内核源代码中查看脚本/usr/src/linux/scripts/mksysmap,该脚本可用于创建系统。地图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

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

最新更新