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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值