我在Linux中運行一些基準測試,我正在尋找一些指示,說明程序已經完成加載並開始運行。預計main()
總是在相同的EIP
是否合理?在單個系統上,我可以期望main()始終處於相同的EIP?
是否EIP
的main()
依賴於該語言?它依賴於編譯器嗎?
是否有任何EIP
程序可以始終預期從何處開始?
我在Linux中運行一些基準測試,我正在尋找一些指示,說明程序已經完成加載並開始運行。預計main()
總是在相同的EIP
是否合理?在單個系統上,我可以期望main()始終處於相同的EIP?
是否EIP
的main()
依賴於該語言?它依賴於編譯器嗎?
是否有任何EIP
程序可以始終預期從何處開始?
沒有。在C中,入口點實際上是_start
,它來自libc
; _start
做了一些初始化,然後調用main
。
main
只是一個常規功能。鏈接器可以選擇重新排列它在過程映像中喜歡的地方。此外,在可執行文件的開始部分使用重定位表之類的東西,.text
部分的開始部分甚至可能不是恆定的。哎呀,如果你正在編寫程序,main
甚至可能不存在。
但是,一個程序總是可以信任的,以便在ELF頭中聲明的入口點地址處開始(假設它是一個ELF可執行文件)。所以,使用它。 readelf
可以告訴你的價值。
是'_start_'保證在單個系統上處於相同的EIP? –
也不,對不起。 – nneonneo
它比這更復雜一點。動態ELF可執行文件實際上引用了ELF解釋器,它實際上是動態庫加載器('ld.so'或'ld-linux-x86-64.so'),它在運行時啓動並加載'libc.so'可執行文件。 –
你爲什麼問? –
我正在編寫一個跨各種運行抽樣性能的工具。我希望在運行基準測試之前啓動PEBS,並在啓動之前忽略所有示例(例如,我並不真正關心從磁盤加載可執行文件的時間)。除了對EIP進行抽樣並確定運行的開始之外,我想不出有什麼辦法可以檢測到程序已經啓動。 –