1

我目前正在尝试对程序进行热补丁(根据已发布的补丁更新程序内存中的代码和数据)。

假设我们可以停止一个正在运行的程序,然后打补丁。如果补丁改变了一些数据初始化或赋值,我们怎么知道变量在哪里,比如堆栈或堆中的那些?


例子:

补丁前:

void func() {
    int a = 1;
}

补丁后:

void func() {
    int a = 2;
}

打补丁时,我们怎么知道堆栈中的位置a(或者可能不在堆栈中)?

4

1 回答 1

1

除非您对编译器的工作原理有很多了解,否则您无法先验地知道这些变量的存储位置,甚至无法知道它们是如何表示的。每个编译器设计者都会为变量的存储方式/存储位置制定自己的规则。

通过检查生成的代码,您可能能够找出特定的编译程序。

于 2016-02-03T04:58:49.297 回答