由于以前存在很多混淆,所以我在这里重新提出一个问题。
我想打印vmlinux
架构power-pc
二进制文件中的所有符号信息 - static
,dynamic(.so)
以及包含kallsyms (module symbols)
和其他任何内容的运行时间其他如果我不知道。
我对使用actually I can not and its difficult to explain here why
,GDB
,readelf
或/proc/kallsyms
或获取system.map
感兴趣(core file
)。
我知道GDB, readelf, objdump, kallsyms or systme.map
是如何生成的。他们使用哪种内核数据结构?他们更喜欢使用哪个库 - libelf
或libdwarf
据我所知,:
libelf/libdwarf
获取所有静态信息。rld_map
部分。kallsyms
,我不知道如何处理将动态添加的LKM的符号信息。考虑到上述情况,请建议我从头开始编写工具是明智的决定。我现在可以使用libdwarf获取所有函数名称及其地址的列表。
有人可以指导我在上面的情况下最好使用的某些源代码,或者可以针对上述情况进行一些修改,而不是从头开始编写某些内容,或者实际上不可能。 (可能是readelf / objdump / GDB的一些片段)
如果需要,请要求澄清和更新。
谢谢!!
答案 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"符号未定义。