假设您有一个函数 foo() 编译到在 Unix 上运行的程序中。
在程序运行时,是否可以通过动态加载包含修改后的 foo() 版本的目标文件来“替换”函数 foo?
在我过去工作过的嵌入式系统上,我们可以取消对文本段的保护,然后基本上“修补” foo() 的地址以指向新修改的 foo()。
它有时用于在客户站点上进行调试,并且有很多特殊限制。
这在 Unix 上可能吗?
假设您有一个函数 foo() 编译到在 Unix 上运行的程序中。
在程序运行时,是否可以通过动态加载包含修改后的 foo() 版本的目标文件来“替换”函数 foo?
在我过去工作过的嵌入式系统上,我们可以取消对文本段的保护,然后基本上“修补” foo() 的地址以指向新修改的 foo()。
它有时用于在客户站点上进行调试,并且有很多特殊限制。
这在 Unix 上可能吗?
这取决于环境,我想。我知道热交换生产代码在 Erlang 模块中是微不足道的,而在 Ruby 中并不太难。C可能是另一种动物。
是的。毕竟,这就是像 gdb 这样的调试器的工作方式。
简而言之,是的,当然这是可能的。问题应该是,“有多难?”
您可以在 Linux 和 Windows 上随心所欲地加载和卸载共享库(.so 和 .DLL)。UNIX 的特定变体,我不确定。这将是实现目标的最简单方法。
如果你不介意弄脏你的手,你总是可以修补代码段以跳转到堆上的其他地方。我不推荐它。