2

我正在寻找一种在 Linux 上查找powerpc cpu 类型的编程方式。执行一些与建议 mfpvr 指令的答案相关的谷歌搜索,我发现这在ELF AUX 标头中可用,果然我可以获得我正在运行的机器的 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 标头的开头?

4

1 回答 1

1

您可以从/proc/self/auxv文件中获取 if

根据man proc /proc/self/auxv从内核级别 2.6.0-test7 开始可用。

另一种选择 - 获取一些(现有的)环境变量 - 比如说HOME, 或PATH, 或其他什么。请注意,你会得到它的地址。从这里你可以返回并找到之前的环境变量,然后是它之前的一个,等等。之后你同样可以跳过所有的 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 ;
}
于 2012-08-14T14:47:30.160 回答