gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:41:14 24 4
gpt4 key购买 nike

函数 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com