由于以前存在很多混乱,因此我在这里改写要删除旧问题的问题。

我想从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

据我的理解说:


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


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

有人可以将我定向到一些最可能在上述情况下使用的源代码,或者可以针对上述情况进行一些修改的源代码,而不是从头开始编写某些东西,否则这实际上是不可能的。 (可能是readelf / objdump / GDB的一些片段)

请要求澄清并根据需要进行更新。

谢谢 !!

最佳答案

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

或者,使用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/

10-10 16:48