[英]Does `execve()` set up registers to invoke dynamic linker or the executable to be executed?
深入理解Linux內核說execve()
調用load_binary()
每個linux_binfmt
對象, load_binary()
調用start_thread()宏來修改保存在內核模式堆棧中的用戶模式寄存器eip和esp的值,以便它們分別指向動態鏈接器的入口和新用戶模式堆棧的頂部。
發生的事情是內核在返回用戶模式時安排
execve
系統調用,以將IP(指令指針)寄存器設置為指向_start
函數的開頭 ,而將SP(堆棧指針)寄存器設置為指向到argv + env字符串列表的開頭,因此從用戶模式的角度來看,效果就像有人調用_start
函數一樣:_start(argc, argv0, argv1, ... , NULL, env0, env1, ... NULL)
在調用約定中,所有參數都在堆棧上傳遞。
通過“ _start
函數的開始”,他是指要執行的可執行文件的入口點嗎?
哪一個是正確的? 即execve()
設置寄存器以調用動態鏈接器或要執行的可執行文件?
_start是可執行文件的入口點。 在C語言中,您可能認為main是切入點,但這只是程序員的觀點。 編譯器可以在_start中插入其他代碼,以在調用main之前運行。
我的解釋是,您所描述的所有問題都發生在調用_start(或似乎要調用_start)之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.