模块 a 已经编译出来了,我想追踪某个函数调用过程。发现 a 模块调用的某个函数在 a 模块自身没有定义。由于项目比较复杂,另外项目还可能包含了第三方的 binary 模块。所以通过看代码不太好 100%确定调用的函数在哪里定义的。能否从编译原理的角度来定位调用的函数是来自于哪个模块?或者模块运行的时候能看吗?已知 a 模块能正常工作。
1
leonshaw 291 天前 1
kallsyms
|
2
LGA1150 291 天前 via Android
如果是内核自己的函数,可以到 elixir.bootlin.com 搜一搜
|
3
geelaw 291 天前
发现 a 调用了某个在 a 没有定义的函数 b ,什么信息让你确定 b 不是 a 的一部分?取决于你已经知道的 b 的信息,进一步获得信息的方式也不同。
如果发现 a 运行的某时刻,程序计数器变成了一个地址 b ,想要知道地址 b 来自哪个动态库,可以下断点,找到你需要的地址,然后调用 dladdr 。 |
4
iOCZS 291 天前
好像有什么 trace 的办法。。。。
|
5
beyondstars 291 天前
猜测 a 模块调用的那个函数的定义是位于一个动态库文件 (shared object, .so) 文件里面。
首先列举该模块饮用了哪些动态库:ldd /bin/ls 例如 /lib/aarch64-linux-gnu/libc.so.6 接下来列举 libc.so.6 里面的符号:nm -D /lib/aarch64-linux-gnu/libc.so.6 |
6
seers 291 天前
最简单的方法就是找到函数的偏移,用 frida hook 后 trace
|
8
huangya OP @beyondstars sorry ,帖子主体没有说明是内核模块,只是在标题提到了
|
9
ccxuy 291 天前
可以啊,直接在需要的地方打一下调用栈 dump_stack, 或者 gdb 调试 qemu 的 linux 内核也行
|