由于之前有很多混乱,所以我在这里重新表述问题,删除旧的问题。
我想在power-pc
架构上打印vmlinux
二进制中的所有符号信息- static
, dynamic(.so)
以及运行时间,包括kallsyms (module symbols)
和任何其他,如果我不知道的话。
我对使用GDB
, readelf
, /proc/kallsyms
或system.map
或获得core file
不感兴趣(actually I can not and its difficult to explain here why
)。
我更感兴趣的是知道GDB, readelf, objdump, kallsyms or systme.map
是如何生成的。它们使用哪种内核数据结构?他们更喜欢使用哪个库- libelf
或libdwarf
我的理解是:
- 所有静态信息使用
libelf/libdwarf
。 -
rld_map
section需要解析为动态的。so文件。 - 对于
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符号未定义