执行期间在内存中复制

问题描述

我正在尝试在程序执行期间进行代码交换的不同方法。使用 QEMU 作为仿真与 ARM926EJ-S 内核的 VersatilePB 板。我找到了一个使用 UART 打印传递字符串的函数。主要有3个函数调用,但这些函数在不同的文件中实现以进行详细说明,每个函数定义都在自己的文件中。函数定义只不过是用不同的字符串调用 print_uart0() 来打印。因此使用关键字 extern 以便在链接期间,函数将能够找到 print_uart0() 定义。

void extern print_uart0(const char *s) {
while(*s != '\0') { /* Loop until end of string */
*UART0DR = (unsigned int)(*s); /* Transmit char */
s++; /* Next char */
 }
}
void main() {
 function_1();
 function_2();
 function_3();
 function_1();
 function_1();
}

我想做的是,例如,如果我有中断信号或更改,将.text的{​​{1}}部分与function_3()的{​​{1}}部分交换GPIO状态 所以基本上所需的输出应该从

改变
.text

应该是这样

function_1()

目的是保持 main 及其函数调用保持不变,但交换指令本身以执行不同的指令。我发现了一个类似的帖子,讨论了类似的情况 in-memory copying in assembly 但目标架构是 x86,所以如果有人可以指导我替代 ARM 指令或更好的方法,那就太好了。

我对 elf 文件有很好的了解,我可以编写自己的链接器脚本来将每个函数"print from function 1" "print from function 2" "print from function 3" "print from function 1" "print from function 1" 部分放在不同的内存地址中

解决方法

没有必要搞乱函数体的复制。 使用函数指针调用正确的函数

void print1()
{
    printf("Function1\n");
}

void print2()
{
    printf("Function2\n");
}

void (*fptr)();// declare function pointer

int main()
{
    fptr = print1; // assign function pointer to 'print1' function
    fptr();        // call 'print1()' by pointer

    fptr = print2; // <-- assign pointer to another function inside interrupt routine

    fptr();        // would call 'print2()'

    return 0;
}