从预编译的Linux内核模块中删除对__gnu_mcount_nc的引用

时间:2013-08-01 12:42:57

标签: linux assembly profiling arm

我有一些二进制Linux内核模块用于某些外围设备。 它运行正常,但它使用分析,我从中删除了支持 出于性能原因的内核。我无法重新编译该模块 因为它的第三方专有软件和我没有访问权限 到源代码。我只拥有所需的目标文件(* .o) 将驱动程序链接到我的Linux内核版本。

是否可以处理.ko文件并删除跳转到 __gnu_mcount_nc功能?我当时想改变操作码 从bl <__gnu_mcount_nc>mov r8,r8,但很难实现 事实上,每个分支到外部函数都有ebfffffe操作码。 这引出了我想要避免的重新定位主题。我在看 对于一些微不足道的解决方案。

Disassembly of section .text:

00000000 <some_func1>:
       0:       e92d4000        push    {lr}
       4:       ebfffffe        bl      18e0 <__gnu_mcount_nc>
       8:       e3a00001        mov     r0, #1
       c:       e12fff1e        bx      lr

00000010 <some_func2>:
      10:       e92d4000        push    {lr}
      14:       ebfffffe        bl      18e0 <__gnu_mcount_nc>
      18:       e3a00001        mov     r0, #1
      1c:       e12fff1e        bx      lr

00000020 <some_func3>:
      20:       e92d4038        push    {r3, r4, r5, lr}
      24:       e92d4000        push    {lr}
      28:       ebfffffe        bl      18e0 <__gnu_mcount_nc>
      2c:       e1a04001        mov     r4, r1
      30:       e59f3038        ldr     r3, [pc, #56]   ; 70 <some_func3+0x50>
      34:       e5905034        ldr     r5, [r0, #52]   ; 0x34
...

目标板基于armv7-a架构和Cortex-A9核心。

修改

问题1: __mcount_loc包含<__gnu_mcount_nc>的相对指针。内核如何知道修复地址指针相对于哪个部分?

问题2:似乎“黑客”内核模块无效。发出insmod .ko触发器错误消息:

  

insmod:无法插入'some_driver.ko':模块中的未知符号或   参数无效

我是否必须从某个部分删除符号__gnu_mcount_nc?即使现在还没有使用它?

寻找一些想法,谢谢。

1 个答案:

答案 0 :(得分:0)

您应该使用FTRACE支持重新编译内核并启用CONFIG_DYNAMIC_FTRACE

您不必担心它会影响性能 - 除非实际启用了跟踪,内核加载器对__gnu_mcount_nc will be NOPped out的所有调用都是如此。这就是__mcount_loc部分(在最终的.ko中) - 它包含二进制文件中bl __gnu_mcount_nc次调用的所有位置的列表。