Linux 内核:能否在编译或者运行环境中找出 a 模块调用的某个函数来源于另外哪个模块吗?

91 天前
 huangya

模块 a 已经编译出来了,我想追踪某个函数调用过程。发现 a 模块调用的某个函数在 a 模块自身没有定义。由于项目比较复杂,另外项目还可能包含了第三方的 binary 模块。所以通过看代码不太好 100%确定调用的函数在哪里定义的。能否从编译原理的角度来定位调用的函数是来自于哪个模块?或者模块运行的时候能看吗?已知 a 模块能正常工作。

1284 次点击
所在节点    Linux
11 条回复
leonshaw
91 天前
kallsyms
LGA1150
91 天前
如果是内核自己的函数,可以到 elixir.bootlin.com 搜一搜
geelaw
91 天前
发现 a 调用了某个在 a 没有定义的函数 b ,什么信息让你确定 b 不是 a 的一部分?取决于你已经知道的 b 的信息,进一步获得信息的方式也不同。

如果发现 a 运行的某时刻,程序计数器变成了一个地址 b ,想要知道地址 b 来自哪个动态库,可以下断点,找到你需要的地址,然后调用 dladdr 。
iOCZS
91 天前
好像有什么 trace 的办法。。。。
beyondstars
91 天前
猜测 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
seers
91 天前
最简单的方法就是找到函数的偏移,用 frida hook 后 trace
huangya
91 天前
@LGA1150 不是内核自己的函数
huangya
91 天前
@beyondstars sorry ,帖子主体没有说明是内核模块,只是在标题提到了
ccxuy
91 天前
可以啊,直接在需要的地方打一下调用栈 dump_stack, 或者 gdb 调试 qemu 的 linux 内核也行
huangya
91 天前
@ccxuy dump_stack 只能找到当前( a 模块中的函数)的吧,并不能找到 a 模块中的函数调用的其他模块函数。dump_stack 是往前找,并不能往后找。
ccxuy
90 天前
@huangya 要详细就 gdb 吧,或者试试 ftrace

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1014936

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX