函数foo已存在于vxworks的系统符号表中。现在我想知道我是否可以用类似函数foo1替换符号foo,它使用相同的参数并使用symAdd例程返回与foo相同的类型?
答案 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()
代替。
这仅适用于调试目的,因此您可以通过动态修补代码继续调试,而无需将新图像写入设备。但是,这种方法不应该用于生产。