进程在初始化时,堆栈里面保存了关于进程执行环境和命令行参数等信息。此外,还保存了动态链接器所需要的辅助信息数组。辅助信息的格式如下数组:
typedef struct
{
uint32_t a_type;
union
{
uint32_t a_val;
}a_un;
}Elf32_auxv_t;
以下小程序可以堆栈的初始化信息:
#include <stdio.h>
#include <elf.h>
/* typedef struct */
/* { */
/* uint32_t a_type; */
/* union */
/* { */
/* uint32_t a_val; */
/* }a_un; */
/* }Elf32_auxv_t; */
int main(int argc, char *argv[])
{
int *pInt = (int *)argv; /* pInt 指向命令行参数数组 */
int iIndex = 0;
Elf32_auxv_t *pAux = NULL;
/* pInt-1 向后偏移四个字节可以指向命令行参数个数 */
printf("==========Argument count : %d===========\n", *(pInt-1));
for (iIndex = 0; iIndex < *(pInt-1); iIndex++)
{
printf("Argument(%d) is : %s\n", iIndex, *(pInt + iIndex));
}
pInt += iIndex; /* 后面是环境变量数组 */
pInt++; /* 中间空出一个4字节0 */
printf("=========Environment :============\n");
while ( *pInt)
{
printf("%s\n",*pInt);
pInt++;
}
pInt++; /* 空出一个4字节0 */
printf("==============Auxiliary Vertors : ============\n");
pAux = (Elf32_auxv_t *)pInt; /* 在后面是辅助信息数组 */
while(pAux->a_type != AT_NULL)
{
printf("Type: %2d Value : %x\n", pAux->a_type, pAux->a_un.a_val);
pAux++;
}
/* 测试一下后面还有什么 */
pInt = (int *)pAux;
pInt++;
iIndex = 0;
printf("==========others :==========\n");
while(NULL != *pInt)
{
printf("others(%d) is : %s\n", iIndex, *pInt);
iIndex++;
}
return 0;
}
编译测试得到如下结果: