c - 代码段的动态重定位

标签 c linux assembly relocation self-modifying

出于好奇,我想知道是否有可能在期间重新定位一段代码 程序的执行。例如,我有一个函数,这个函数应该 每次执行后都会在内存中替换。我们想到的一个想法 是使用自修改代码来做到这一点。根据网上的一些资源,自行修改 代码可以在 Linux 上执行,但我仍然不确定这样的动态重定位是否可行。有人有这方面的经验吗?

最佳答案

是的,动态重定位绝对是可能的。但是,您必须确保代码是完全独立的,或者它通过绝对引用访问全局变量/外部函数。如果您的代码可以完全独立于位置,这意味着它所做的唯一引用是相对于自身的,那么您就设置好了。否则,您将需要在加载时自己进行修复。

在 GCC 中,您可以使用 -fpic 生成与位置无关的代码。将 -q--emit-relocs 传递给链接器将使它发出重定位信息。 ELF specification (PDF 链接)有关于如何使用该搬迁信息的信息;如果您不使用 ELF,则必须找到适合您的格式的文档。

关于c - 代码段的动态重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313048/

相关文章:

python - 如何处理 Linux/Python 依赖?

c - 关于Linux C-UUID

c++ - 汇编代码中的引用/指针

c - readdir 为目录返回 d_type == DT_UNKNOWN 的 dirent。和

c - 传递指针和复制值

c - 为什么不应该在 linux 内核中将全局变量初始化为 0/NULL/false?

c++ - 当大小是变量而不是常量时如何创建数组?

linux - 通过剪切从给定文件中删除单词

c - 为什么 Linux 不遵循 Unix 系统调用约定?

assembly - BIOS 总是无法执行磁盘操作