我有一些二进制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?即使现在还没有使用它?
寻找一些想法,谢谢。
答案 0 :(得分:0)
您应该使用FTRACE支持重新编译内核并启用CONFIG_DYNAMIC_FTRACE
。
您不必担心它会影响性能 - 除非实际启用了跟踪,内核加载器对__gnu_mcount_nc
will be NOPped out的所有调用都是如此。这就是__mcount_loc
部分(在最终的.ko中) - 它包含二进制文件中bl __gnu_mcount_nc
次调用的所有位置的列表。