如何在C语言中将程序执行跳转到特定地址?

11 浏览
0 Comments

如何在C语言中将程序执行跳转到特定地址?

我想让程序跳转到内存中的特定地址,并从该地址继续执行。 我考虑使用goto,但我没有标签,而只有一个内存地址。

不需要担心从跳转地址返回。

编辑:使用GCC编译器。

admin 更改状态以发布 2023年5月23日
0
0 Comments

gcc有一个扩展,允许跳转到任意地址:

void *ptr = (void *)0x1234567;  // a random memory address
goto *ptr;                      // jump there -- probably crash

这几乎与使用设置为固定值的函数指针相同,但实际上将使用跳转指令而不是调用指令(因此堆栈不会被修改)

0
0 Comments

使用内联汇编可能是最简单且最“优雅”的解决方案,尽管这样做非常罕见,除非你正在编写调试器或一些专门的自省系统。

另一个选项可能是声明一个指向void函数的指针 (void (*foo)(void)),然后将指针设置为包含你的地址,然后调用它:

void (*foo)(void) = (void (*)())0x12345678;
foo();

编译器会将一些东西压入栈中,因为它认为你正在执行一个子例程调用,但由于你不在意返回,这可能会起作用。

0