根據圖像,堆棧在啓動時被填入輔助向量條目。
我不知道它之前。
如何訪問/打印它們?
int main(int argc, char *argv[], char *envp[]);
是否意味着main
有一個隱藏的第四個參數?
根據圖像,堆棧在啓動時被填入輔助向量條目。
我不知道它之前。
如何訪問/打印它們?
int main(int argc, char *argv[], char *envp[]);
是否意味着main
有一個隱藏的第四個參數?
您的問題的答案是系統特定的。 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
類型的,如下所示:
在AUX矢量立即位於過去的環境載體,它是可訪問的端部(每POSIX)爲extern char **environ;
。 environ
指向指向環境變量的空指針終止數組char *
。遍歷整個環境直到達到NULL
,然後再推進一個元素,並將結果轉換爲您想要用於訪問輔助矢量的任何類型。就我個人而言,我將它視爲size_t
或uintptr_t
值對的數組,因爲它比elf.h
Elf32_auxv_t
和Elf64_auxv_t
類型更容易且更便於攜帶(這要求您特殊情況下是否要構建32位或64位目標)。
請注意,輔助矢量的存在和位置不由POSIX指定,但這是它們將位於任何使用輔助矢量的基於ELF-ABI的實現的位置。
您是否知道這些細節總是依賴於系統? – dmckee
他們在堆棧中。您可以使用內聯ASM訪問堆棧。 – Stan
@dmckee,沒關係,我只是需要這個想法,並會找出具體系統的確切案例。 – lexer