programatic way to find ELF aux header (or envp) in shared library code?

眉间皱痕 提交于 2019-12-24 00:01:14

问题


I'm looking for a programatic way to find the powerpc cpu type on Linux. Performing some google searches associated an answer suggesting the mfpvr instruction I found that this is available in the ELF AUX header, and sure enough I can obtain the POWER5 string for the machine I'm running on with the following:

#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 ;
}

In the shared library context where I want to use this info I have no access to envp. Is there an alternate programatic method to find the beginning of the ELF AUX header?


回答1:


You can get if from /proc/self/auxv file

According to man proc /proc/self/auxv is available since kernel level 2.6.0-test7.

Another option - get some (existing) environment variable - let say HOME, or PATH, or whatever. Please note that you'll get it's ADDRESS. From here you can go back and find previous env variable, then one before it, etc. After that you can likewise skip all argv arguments. And then you get to the last AUXV entry. Some steps back - and you should be able find your AT_PLATFORM.

EDIT: It looks like glibc now provides a programatic method to get at this info:

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

Example:

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

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

   return 0 ;
}


来源:https://stackoverflow.com/questions/11593890/programatic-way-to-find-elf-aux-header-or-envp-in-shared-library-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!