0

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

是否可以处理 .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 吗?即使它现在没有使用?

寻找一些想法,谢谢。

4

1 回答 1

0

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

您无需担心它会影响性能 - 除非实际启用了跟踪,否则内核加载程序__gnu_mcount_nc 将 NOPped所有调用。这就是该__mcount_loc部分(在最终的 .ko 中)的用途 - 它包含bl __gnu_mcount_nc二进制文件中所有调用位置的列表。

于 2013-08-01T13:39:51.320 回答