动态重定位代码段

Phi*_*hil 12 c linux assembly relocation self-modifying

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

Car*_*rum 8

是动态搬迁肯定是可能的.但是,您必须确保代码完全自包含,或者通过绝对引用访问全局/外部函数.如果你的代码可以完全独立于位置,意味着它所做的唯一引用是相对于它自己的,那么你就可以了.否则,您需要在加载时自行进行修正.

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