在共享库代码中找到ELF aux头(或envp)的编程方法?

时间:2012-07-21 16:26:56

标签: elf

我正在寻找一种在Linux上找到powerpc cpu type的程序方法。执行一些谷歌搜索相关的答案提示mfpvr指令我发现这可以在ELF AUX header中找到,并且我确实可以获得我正在运行的机器的POWER5字符串,其中包含以下内容:

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

int main( int argc, char **argv, char **envp )
{
   /* walk past all env pointers */
   while ( *envp++ != NULL )
      ;

   /* and find ELF auxiliary vectors (if this was an ELF binary) */
#if 0
   Elf32_auxv_t * auxv = (Elf32_auxv_t *) envp ;
#else
   Elf64_auxv_t * auxv = (Elf64_auxv_t *) envp ;
#endif

   char * platform = NULL ;

   for ( ; auxv->a_type != AT_NULL ; auxv++ )
   {
      if ( auxv->a_type == AT_PLATFORM )
      {
         platform = (char *)auxv->a_un.a_val ;
         break;
      }
   }

   if ( platform )
   {
      printf( "%s\n", platform ) ;
   }

   return 0 ;
}

在我想使用此信息的共享库上下文中,我无法访问envp。是否有另一种编程方法可以找到ELF AUX标头的开头?

1 个答案:

答案 0 :(得分:1)

您可以从/proc/self/auxv文件

获取

根据man proc /proc/self/auxv,自内核级别2.6.0-test7起可用。

另一种选择 - 获取一些(现有的)环境变量 - 比如说HOME, 或PATH,或其他什么。请注意,你会得到它的地址。从这里你可以回去找到之前的env变量,然后找到它之前的变量等。之后你也可以跳过所有的argv参数。然后你到达最后一个AUXV条目。退回一些步骤 - 您应该能够找到AT_PLATFORM

编辑:看起来glibc现在提供了一种编程方法来获取此信息:

glibc-headers-2.17-106:/usr/include/sys/auxv.h:getauxinfo()

示例:

#include <sys/auxv.h>
#include <stdio.h>

int main()
{
   unsigned long v = getauxval( AT_PLATFORM ) ;
   printf( "%s\n", (char *)v ) ;

   return 0 ;
}