我正在寻找一种在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标头的开头?
答案 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 ;
}