访问辅助矢量C.

时间:2014-10-23 02:03:10

标签: c loading elf

我尝试使用auxiliary vectors访问C中的the following code

  int main(int argc, char** argv, char* envp[]) {
  Elf64_auxv_t *auxv;
  while(*envp++ != NULL); 

  /*from stack diagram above: *envp = NULL marks end of envp*/
  int i = 0 ; 
  for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
    /* auxv->a_type = AT_NULL marks the end of auxv */
    {
      printf("%u %u %u \n", (auxv->a_type), AT_PLATFORM, i++);
      if( auxv->a_type == AT_PLATFORM)
        fprintf(stdout, "AT_PLATFORM is: %s\n", (auxv->a_un.a_val));
    }
  }

但我得到的结果是垃圾。运行readelf告诉我,我确实运行了64位二进制文​​件。我理解其他方法(例如libc中的getauxv),但我很好奇为什么这种特殊的做法不起作用

Thansk

1 个答案:

答案 0 :(得分:2)

您的代码中有一些错误gcc -Wall很乐意告诉您:

#include <stdio.h>
#include <elf.h>

int main(int argc, char** argv, char* envp[]) {
  Elf64_auxv_t *auxv;
  while(*envp++ != NULL);

  /*from stack diagram above: *envp = NULL marks end of envp*/
  int i = 0 ;
  for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
    /* auxv->a_type = AT_NULL marks the end of auxv */
  {
    printf("%lu %u %u \n", (auxv->a_type), AT_PLATFORM, i++);
    if( auxv->a_type == AT_PLATFORM)
      printf("AT_PLATFORM is: %s\n", ((char*)auxv->a_un.a_val));
  }
}

以上代码适用于我(它打印AT_PLATFORM is: x86_64)。