我有一些外围设备的二进制 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 吗?即使它现在没有使用?
寻找一些想法,谢谢。