簡體   English   中英

execve()是否設置寄存器以調用動態鏈接器或要執行的可執行文件?

[英]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的值,以便它們分別指向動態鏈接器入口和新用戶模式堆棧的頂部。

mosvy寫道:

發生的事情是內核在返回用戶模式時安排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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM