2

LinuxでpowerpcのCPUタイプをプログラムで見つける方法を探しています。mfpvr 命令を示唆する回答に関連付けられたいくつかの Google 検索を実行すると、これが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。ADDRESS を取得することに注意してください。ここから戻って、前の 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 ;
}
于 2012-08-14T14:47:30.160 に答える