0

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

我想从架构vmlinux上的二进制文件中打印所有符号信息 -以及运行时间,包括我不知道的任何其他信息。power-pcstaticdynamic(.so)kallsyms (module symbols)

我对actually I can not and its difficult to explain here why使用GDBreadelf/proc/kallsyms获取.system.mapcore file

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

据我了解:

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

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

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

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

谢谢 !!

4

1 回答 1

0

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

或者,使用以下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" 符号未定义。

于 2014-07-15T04:20:54.353 回答