V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

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

  •  
  •   huangya · 288 天前 · 1423 次点击
    这是一个创建于 288 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  287 天前
    是 linux 内核模块,不是用户空间的库
    第 2 条附言  ·  287 天前
    一楼正解。已找到。
    11 条回复    2024-02-08 17:30:34 +08:00
    leonshaw
        1
    leonshaw  
       288 天前   ❤️ 1
    kallsyms
    LGA1150
        2
    LGA1150  
       288 天前 via Android
    如果是内核自己的函数,可以到 elixir.bootlin.com 搜一搜
    geelaw
        3
    geelaw  
       288 天前
    发现 a 调用了某个在 a 没有定义的函数 b ,什么信息让你确定 b 不是 a 的一部分?取决于你已经知道的 b 的信息,进一步获得信息的方式也不同。

    如果发现 a 运行的某时刻,程序计数器变成了一个地址 b ,想要知道地址 b 来自哪个动态库,可以下断点,找到你需要的地址,然后调用 dladdr 。
    iOCZS
        4
    iOCZS  
       288 天前
    好像有什么 trace 的办法。。。。
    beyondstars
        5
    beyondstars  
       288 天前
    猜测 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
        6
    seers  
       288 天前
    最简单的方法就是找到函数的偏移,用 frida hook 后 trace
    huangya
        7
    huangya  
    OP
       287 天前
    @LGA1150 不是内核自己的函数
    huangya
        8
    huangya  
    OP
       287 天前
    @beyondstars sorry ,帖子主体没有说明是内核模块,只是在标题提到了
    ccxuy
        9
    ccxuy  
       287 天前
    可以啊,直接在需要的地方打一下调用栈 dump_stack, 或者 gdb 调试 qemu 的 linux 内核也行
    huangya
        10
    huangya  
    OP
       287 天前
    @ccxuy dump_stack 只能找到当前( a 模块中的函数)的吧,并不能找到 a 模块中的函数调用的其他模块函数。dump_stack 是往前找,并不能往后找。
    ccxuy
        11
    ccxuy  
       287 天前
    @huangya 要详细就 gdb 吧,或者试试 ftrace
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:29 · PVG 03:29 · LAX 11:29 · JFK 14:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.