出于好奇,我想知道是否有可能在期间重新定位一段代码 程序的执行。例如,我有一个函数,这个函数应该 每次执行后都会在内存中替换。我们想到的一个想法 是使用自修改代码来做到这一点。根据网上的一些资源,自行修改 代码可以在 Linux 上执行,但我仍然不确定这样的动态重定位是否可行。有人有这方面的经验吗?
最佳答案
是的,动态重定位绝对是可能的。但是,您必须确保代码是完全独立的,或者它通过绝对引用访问全局变量/外部函数。如果您的代码可以完全独立于位置,这意味着它所做的唯一引用是相对于自身的,那么您就设置好了。否则,您将需要在加载时自己进行修复。
在 GCC 中,您可以使用 -fpic
生成与位置无关的代码。将 -q
或 --emit-relocs
传递给链接器将使它发出重定位信息。 ELF specification (PDF 链接)有关于如何使用该搬迁信息的信息;如果您不使用 ELF,则必须找到适合您的格式的文档。
关于c - 代码段的动态重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313048/