首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将程序执行跳转到C中的特定地址?

如何将程序执行跳转到C中的特定地址?
EN

Stack Overflow用户
提问于 2011-11-17 04:11:20
回答 8查看 26.6K关注 0票数 12

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

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

编辑:使用GCC编译器

EN

回答 8

Stack Overflow用户

发布于 2011-11-17 04:16:32

内联汇编可能是最简单和最“优雅”的解决方案,尽管这样做是非常不寻常的,除非您正在编写调试器或一些专门的内省系统。

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

代码语言:javascript
复制
void (*foo)(void) = (void (*)())0x12345678;
foo();

由于编译器认为你正在执行子例程调用,所以会有一些东西被推到堆栈上,但由于你并不关心返回,所以这可能会起作用。

票数 29
EN

Stack Overflow用户

发布于 2013-06-14 06:48:45

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

代码语言:javascript
复制
void *ptr = (void *)0x1234567;  // a random memory address
goto *ptr;                      // jump there -- probably crash

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

票数 20
EN

Stack Overflow用户

发布于 2011-11-17 04:46:02

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

void go(unsigned int addr) {
  (&addr)[-1] = addr;
}

int sub() {
  static int i;
  if(i++ < 10) printf("Hello %d\n", i);
  else exit(0);
  go((unsigned int)sub);
}

int main() {
  sub();
}

当然,这调用了未定义的行为,依赖于平台,假设代码地址与int的大小相同,等等。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8158007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档