您的位置:首页 > 职场人生

打印动态链接时进程堆栈的初始化信息(摘自<程序员的自我修养>)

2016-12-11 10:54 204 查看
进程在初始化时,堆栈里面保存了关于进程执行环境和命令行参数等信息。此外,还保存了动态链接器所需要的辅助信息数组。辅助信息的格式如下数组:

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;
}
编译测试得到如下结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linker loader