symAdd可以用来覆盖sysSymTbl中的现有符号吗?

时间:2017-09-21 12:29:33

标签: c vxworks

函数foo已存在于vxworks的系统符号表中。现在我想知道我是否可以用类似函数foo1替换符号foo,它使用相同的参数并使用symAdd例程返回与foo相同的类型?

1 个答案:

答案 0 :(得分:0)

您无法使用系统仪器执行此操作。如果某个函数g()调用foo(),则此函数静态链接到foo()。这意味着,g()正文包含call <hardcoded_address_of_foo()>之类的机器指令。这意味着,如果不实际更改所有foo()个来电者或foo1()本身的机器说明,则无法将foo()替换为foo()

然而,很有可能在运行中改变某些功能的机器指令。因此,如果你很了解你的平台,你实际上可以在较低级别上执行功能替换技巧。我成功地为针对MIPS架构编译的VxWorks 5.5做了这个。

什么对我有用(一切都在shell中完成):

  • 使用foo()
  • 获取foo1()lkup的地址
  • 计算机器指令jump <address_of_foo1>应如何用十六进制表示
  • 使用m()修改foo()正文占用的RAM,以便将foo()的第一条指令替换为foo()的{​​{1}}计算的第一条指令nop 。后者是必需的,因为在我的平台(delay slot instruction
  • 上再执行一条指令后执行所有跳转

结果foo()已损坏,但现在它执行即时跳转到foo1()同时保持所有信息完整(堆栈,寄存器等),因此看起来总是调用foo1()代替。

这仅适用于调试目的,因此您可以通过动态修补代码继续调试,而无需将新图像写入设备。但是,这种方法不应该用于生产。