在动态链接器的角度来说,当获得控制权的时候,需要知道关于可执行文件和进程的一些信息,例如每个段的属性、程序的入口地址(未来要转交的地方)等。这些信息往往储存在进程的堆栈里,即动态链接器所需要的辅助信息数组(Auxiliary Vector)

数组的结构和 .dynamic 里面的结构一致,先是一个 32 位的类型值,然后是一个 32 位的数值

类型的值含义有:

  • 0:结束
  • 2:可执行文件的 handle (fd)
  • 3:Header 在文件中的地址(让动态链接器在内存中读取)
  • 4:可执行文件中程序头每个的大小
  • 5:entry 数量
  • 7:动态链接器本身的装载地址
  • 9:可执行文件的入口地址

该数组就放在环境变量指针的后面(32 位)

#include <elf.h>
#include <stdio.h>
#include "Lib.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 (i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
 
    p += i;
    p++;
 
    printf("Environment:\n");
    while (*p) {
        printf("%s\n", *p);
        p++;
    }
    p++;
 
    printf("Auxiliary Vectors:\n");
    aux = (Elf32_auxv_t *)p;
    while (aux->a_type != AT_NULL) {
        printf("Type: %02d Value: %08x\n", aux->a_type, aux->a_un.a_val);
        aux++;
    }
}
 
 
// -m32 -fPIC