3

假设您有一个函数 foo() 编译到在 Unix 上运行的程序中。

在程序运行时,是否可以通过动态加载包含修改后的 foo() 版本的目标文件来“替换”函数 foo?

在我过去工作过的嵌入式系统上,我们可以取消对文本段的保护,然后基本上“修补” foo() 的地址以指向新修改的 foo()。

它有时用于在客户站点上进行调试,并且有很多特殊限制。

这在 Unix 上可能吗?

4

3 回答 3

1

这取决于环境,我想。我知道热交换生产代码在 Erlang 模块中是微不足道的,而在 Ruby 中并不太难。C可能是另一种动物。

于 2010-02-02T01:37:12.153 回答
1

是的。毕竟,这就是像 gdb 这样的调试器的工作方式。

于 2010-02-02T01:48:16.937 回答
0

简而言之,是的,当然这是可能的。问题应该是,“有多难?”

您可以在 Linux 和 Windows 上随心所欲地加载和卸载共享库(.so 和 .DLL)。UNIX 的特定变体,我不确定。这将是实现目标的最简单方法。

如果你不介意弄脏你的手,你总是可以修补代码段以跳转到堆上的其他地方。我不推荐它。

于 2010-02-02T01:42:45.437 回答