2011-08-30 47 views
3

enter image description here如何訪問/打印main中的輔助矢量條目?

根據圖像,堆棧在啓動時被填入輔助向量條目。

我不知道它之前。

如何訪問/打印它們?

int main(int argc, char *argv[], char *envp[]); 

是否意味着main有一個隱藏的第四個參數?

+1

您是否知道這些細節總是依賴於系統? – dmckee

+0

他們在堆棧中。您可以使用內聯ASM訪問堆棧。 – Stan

+0

@dmckee,沒關係,我只是需要這個想法,並會找出具體系統的確切案例。 – lexer

回答

0

您的問題的答案是系統特定的。 C ISO僅定義了main函數的兩個參數。其他參數不是標準的,應該被視爲擴展。維基百科引用Main function

參數argc那樣,參數計數,和argv,參數向量,[1]分別提供的該程序的命令行參數的數量和價值。 argc和argv的名稱可以是C中的任何有效標識符,但使用這些名稱通常是慣例。在C++中,名稱應從字面上理解,並且如果需要嚴格的一致性,則參數列表中的「void」將被省略。 [2] C和C++標準也允許其他平臺相關格式,但在C++中返回類型必須保持爲int;例如,Unix的(雖然不是POSIX.1)和Microsoft Windows有第三個參數給程序的環境下,通過GETENV容易另外stdlib.h中:

int main(int argc, char **argv, char **envp) 

Mac OS X和達爾文有第四參數包含任意OS提供的信息,如路徑到執行二進制:[3]

int main(int argc, char **argv, char **envp, char **apple) 

的AMD64 ABI

根據該System V ABI for AMD64, Draft 0.99.5,輔助矢量條目auxv_t類型的,如下所示:

The AMD64 ABI uses the auxiliary vector types defined in figure 3.11.

2

在AUX矢量立即位於過去的環境載體,它是可訪問的端部(每POSIX)爲extern char **environ;environ指向指向環境變量的空指針終止數組char *。遍歷整個環境直到達到NULL,然後再推進一個元素,並將結果轉換爲您想要用於訪問輔助矢量的任何類型。就我個人而言,我將它視爲size_tuintptr_t值對的數組,因爲它比elf.hElf32_auxv_tElf64_auxv_t類型更容易且更便於攜帶(這要求您特殊情況下是否要構建32位或64位目標)。

請注意,輔助矢量的存在和位置不由POSIX指定,但這是它們將位於任何使用輔助矢量的基於ELF-ABI的實現的位置。