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