2012-07-21 50 views
2

我正在尋找一種可以在Linux上找到powerpc cpu type的程序化方法。執行相關答案暗示mfpvr指令,我發現,這是在ELF AUX header可用的,果然,我可以得到我與運行在機器的POWER5串一些谷歌搜索如下:在共享庫代碼中查找ELF輔助頭(或envp)的程序化方法?

#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

你可以從如果文件/proc/self/auxv

根據man proc/proc/self/auxv是因爲內核級2.6.0-TEST7可用。

另一種選擇 - 獲取一些(現有的)環境變量 - 例如說HOME, 或PATH,或其他什麼。請注意,你會得到它的地址。從這裏你可以回過頭去找到以前的env變量,然後找到它之前的變量,等等。之後你可以跳過所有的argv參數。然後你到達最後一個AUXV條目。有些退步 - 你應該能找到你的AT_PLATFORM

編輯:它看起來像glibc的現在提供了一個程序化的方法來得到這個信息:

的glibc-頭-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 ; 
} 
+0

即使在2.6.16(可能更早)也可用。 – 2012-08-14 19:22:24

+0

2.4.22(Fedora Core 1)沒有/ proc/self/auxv – 2012-08-15 07:34:17

+0

對於那些仍然試圖鏈接到過時平臺的人(是的,我!):使用'getenv()'(或全局符號'environ' )如果有人已經調用了'setenv()'並導致該條目被重定位,則存在訪問未分配內存的風險。 – sh1 2016-03-22 03:55:47