我正在为 MSP430 微控制器开发一个项目。该项目是一个代码检测工具,它需要对部署在设备上的所有代码进行检测。该工具基本上已经准备就绪,但有一个问题:为了工作,它需要某个应用程序的所有源代码(无论是汇编还是 C 语言)在编译之前都可用。
但是,当使用 mspgcc(为 MSP430 微控制器开发的 gcc 的开源版本)编译某些应用程序时,编译器会创建一些代码存根来优化整个应用程序。例如,这些存根可用于执行多个班次操作,允许应用程序在需要执行一定数量的班次时跳转到入口点(而不是内联它们)。这是一个例子:
00005df4 <__mspabi_srll_4>:
5df4: 12 c3 clrc
5df6: 0d 10 rrc r13 ;
5df8: 0c 10 rrc r12 ;
00005dfa <__mspabi_srll_3>:
5dfa: 12 c3 clrc
5dfc: 0d 10 rrc r13 ;
5dfe: 0c 10 rrc r12 ;
00005e00 <__mspabi_srll_2>:
5e00: 12 c3 clrc
5e02: 0d 10 rrc r13 ;
5e04: 0c 10 rrc r12 ;
00005e06 <__mspabi_srll_1>:
5e06: 12 c3 clrc
5e08: 0d 10 rrc r13 ;
5e0a: 0c 10 rrc r12 ;
5e0c: 10 01 reta ;
00005e0e <.L1^B3>:
5e0e: 3e 53 add #-1, r14 ;r3 As==11
5e10: 12 c3 clrc
5e12: 0d 10 rrc r13 ;
5e14: 0c 10 rrc r12 ;
00005e16 <__mspabi_srll>:
5e16: 0e 93 cmp #0, r14 ;r3 As==00
5e18: fa 23 jnz $-10 ;abs 0x5e0e
5e1a: 10 01 reta ;
此汇编代码允许应用程序通过简单的 CALL 执行跳转到这些入口点:
CALLA #__mspabi_srll
编译器添加了几个这样的附加代码存根,它们都称为“ _mspabi .... ”。但是,由于我无法检测这些函数的代码(因为我相信它是在链接时添加的),所以我必须执行以下操作之一:
- 阻止编译器/链接器使用这些指令(它们在 -O0 和 -O3 上都使用)
- 修改这些指令的源代码以检测它们(我想它们是静态链接库或类似的东西,没有可用的源代码。我尝试删除所有包含指令,但仍然注入额外的代码)
- 实现我自己的检测代码存根,以便使用它们而不是这些存根(此时不得将其包含在二进制文件中)
有人可以帮我实现三个选项之一吗?或者也许还有其他建议!提前谢谢你,我真的很感激任何帮助。