1

我正在为 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 .... ”。但是,由于我无法检测这些函数的代码(因为我相信它是在链接时添加的),所以我必须执行以下操作之一:

  1. 阻止编译器/链接器使用这些指令(它们在 -O0 和 -O3 上都使用)
  2. 修改这些指令的源代码以检测它们(我想它们是静态链接库或类似的东西,没有可用的源代码。我尝试删除所有包含指令,但仍然注入额外的代码)
  3. 实现我自己的检测代码存根,以便使用它们而不是这些存根(此时不得将其包含在二进制文件中)

有人可以帮我实现三个选项之一吗?或者也许还有其他建议!提前谢谢你,我真的很感激任何帮助。

4

0 回答 0