【发布时间】:2021-04-18 17:10:03
【问题描述】:
我写了一个小测试来尝试打印程序的初始化堆栈,这里是代码
#include <stdio.h>
#include <elf.h>
int main(int argc, char* argv[])
{
int *p = (int*)argv;
int i;
Elf32_auxv_t* aux;
printf("Argument count: %d\n", *(p - 1));
for (int i = 0; i < *(p - 1); ++i)
{
printf("Argument %d : %s\n", i, *(p + i));
}
p+=i;
p++;
printf("Enviroment\n");
while (*p)
{
printf("%s\n", *p);
p++;
}
p++;
printf("Auxiliary Vector\n");
aux = (Elf32_auxv_t*)p;
while (aux->a_type != AT_NULL)
{
printf("Type: %02d Value: %x\n", aux->a_type, aux->a_un.a_val);
aux++;
}
return 0;
}
我想看到的是打印环境指针和 AT_PHDR、AT_PHENT、AT_PHNUM、AT_ENTRY 和 AT_NULL。但结果显示这里是一个核心转储
Argument count: 0
Enviroment
Segmentation fault (core dumped)
程序有什么问题?感谢您的帮助。
【问题讨论】:
-
请注意,
main的 third 参数讨论不多(指向环境的指针):int main(int argc,char **argv,char **envp)如果您在某些拱门上(例如 @ 987654325@)、argc、argv和envp不在堆栈上。它们在寄存器中:(分别为%edi、%rsi、%rdx)。如果您想查看/转储初始 堆栈,您需要__builtin_frame_address(0)并执行(例如):char **vp = __builtin_frame_address(0); for (int idx = 0; idx < 32; ++idx, ++vp) printf("%d: %p %p\n",idx,vp,*vp); -
@Craig Estey 感谢您的回复。那么这个程序可能只能在32位系统上运行?