作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
函数 foo 已存在于 vxworks 的系统符号表中。现在我想知道是否可以使用 symAdd 例程将符号 foo 替换为类似的函数 foo1 ,该函数采用相同的参数并返回与 foo 相同的类型?
最佳答案
您不应该能够使用系统工具来执行此操作。如果有一些功能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()
与 nop
。后者是必需的,因为所有跳转都是在我的平台上执行一条指令后执行的( delay slot instruction )结果foo()
已损坏,但现在它执行即时跳转到 foo1()
同时保持所有信息完整(堆栈、寄存器等),所以它看起来像 foo1()
总是被调用。
这仅适用于调试目的,因此您可以通过动态修补代码来继续调试,而无需将新镜像写入设备。但是,这种方法不应该在生产中使用。
关于symAdd 可以用来覆盖 sysSymTbl 中的现有符号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46343962/
函数 foo 已存在于 vxworks 的系统符号表中。现在我想知道是否可以使用 symAdd 例程将符号 foo 替换为类似的函数 foo1 ,该函数采用相同的参数并返回与 foo 相同的类型? 最
我是一名优秀的程序员,十分优秀!