Assembly 程序如何在堆栈中查找全局变量?
据我所知,当我声明全局变量Assembly 程序如何在堆栈中查找全局变量?,assembly,x86,binary,stack,global-variables,Assembly,X86,Binary,Stack,Global Variables,据我所知,当我声明全局变量intmy_var, 它位于(未初始化全局数据)或(初始化全局数据)部分的固定地址 ex) int my_var;// 您能否提供一个示例或参考书,说明堆栈上存储的全局变量 堆栈的要点是根据(时态)变量的范围分配内存,因此将堆栈用于“始终活动”变量是没有意义的(正如您所说,还有其他部分用于此目的) 关于您的示例(int my_var=0x1337;),初始化变量可能不会分配到只读部分,因为这并不意味着它在某个时刻不会被修改(除了编译器的决定) 问题。程序如何在堆栈内找到
intmy_var代码>,
它位于
(未初始化全局数据)或
(初始化全局数据)部分的固定地址
ex)
int my_var;// 您能否提供一个示例或参考书,说明堆栈上存储的全局变量
堆栈的要点是根据(时态)变量的范围分配内存,因此将堆栈用于“始终活动”变量是没有意义的(正如您所说,还有其他部分用于此目的)
关于您的示例(int my_var=0x1337;
),初始化变量可能不会分配到只读部分,因为这并不意味着它在某个时刻不会被修改(除了编译器的决定)
问题。程序如何在堆栈内找到全局变量(非固定区域)
堆栈是一个后进先出队列,其中一个指针指示最近的位置,每个时态变量都会获得一个地址(创建时,在堆栈边界内),该地址指示其位置,直到它被销毁(超出范围)并更新堆栈指针。但是环境变量不存储在堆栈上,它们位于堆栈上方:\u environ,等等。。。不位于烟囱内;它们是普通的全局变量,是指向堆栈中位置的指针(即值为地址的变量)。事实上,初始程序环境、参数等。。。是堆栈中的一个实现细节。它们可以很容易地分配到堆中,或者分配到其他适合运行时的区域
唯一重要的是运行时启动和操作系统在何处找到它们达成一致
[回应评论]
以下程序应说明:
#include <stdio.h>
extern char **environ;
int main() {
int x;
printf("&envrion = %p\n", &environ);
printf("environ = %p\n", environ);
printf("*environ = %p [%s]\n", *environ, *environ);
printf("&x = %p\n", &x);
return 0;
}
请注意,&environ的地址与environ、*environ和&x的地址大不相同。这是因为后者在堆栈中,而environ本身不在堆栈中。正如您所发现的,全局变量不存储在堆栈中。如果是,第一个问题是:哪个堆栈,因为每个线程都有自己的专用堆栈分配给它。为什么对同一主题有两个不同的问题<代码>int my_var=0x1337代码>不能进入.rodata
除非它是常量
,否则会导致我的var++
出现故障。它实际上会进入.data
。你是说。。“程序具有全局变量X
,该变量保存堆栈中\uuuu environ
的地址,操作系统可以使用全局变量X
查找\uuu environ
”。我的理解正确吗?谢谢你详细而可观的答复!:黛雅。您可以使用debbuger在堆栈中轻松找到全局变量。只需将调试器附加到任何简单的程序上,然后键入gdb>x/s program\u invocation\u name
。这是用于打印程序调用\u名称的命令,它是自动初始化的全局变量。然后,您会发现这个值位于堆栈内存区域,即使它是一个全局变量@최지원: 它可能是指向堆栈内存的指针,其中由argv[0]
指向的字符串在进程启动之前由内核存储。指针值本身存储在.bss
中,您可以通过查看&program\u invocation\u name
看到它。哦,mevets已经将此作为答案发布了。@PeterCordes感谢您的回答,根据您的建议,我可以在mybinary
的.bss
中找到变量&program\u invocation\u name
!但是,在某些二进制文件中,&程序调用\u名称
位于libc
的.data
中,而不是mybinary的.bss
中。你知道为什么吗?是因为。。。大概编译器版本问题还是类似的问题@최지원: 可能取决于您在C源代码中如何声明它,是否重写库的符号。@PeterCordes感谢您每次都给了我一个好的答案。:)
#include <stdio.h>
extern char **environ;
int main() {
int x;
printf("&envrion = %p\n", &environ);
printf("environ = %p\n", environ);
printf("*environ = %p [%s]\n", *environ, *environ);
printf("&x = %p\n", &x);
return 0;
}
&envrion = 0x6bbda8
environ = 0x7ffdd6edb3e8
*environ = 0x7ffdd6edb9a2 [CLUTTER_IM_MODULE=xim]
&x = 0x7ffdd6edb2a4