2012-09-23 42 views
0

我在Linux中運行一些基準測試,我正在尋找一些指示,說明程序已經完成加載並開始運行。預計main()總是在相同的EIP是否合理?在單個系統上,我可以期望main()始終處於相同的EIP?

是否EIPmain()依賴於該語言?它依賴於編譯器嗎?

是否有任何EIP程序可以始終預期從何處開始?

+0

你爲什麼問? –

+0

我正在編寫一個跨各種運行抽樣性能的工具。我希望在運行基準測試之前啓動PEBS,並在啓動之前忽略所有示例(例如,我並不真正關心從磁盤加載可執行文件的時間)。除了對EIP進行抽樣並確定運行的開始之外,我想不出有什麼辦法可以檢測到程序已經啓動。 –

回答

3

沒有。在C中,入口點實際上是_start,它來自libc; _start做了一些初始化,然後調用main

main只是一個常規功能。鏈接器可以選擇重新排列它在過程映像中喜歡的地方。此外,在可執行文件的開始部分使用重定位表之類的東西,.text部分的開始部分甚至可能不是恆定的。哎呀,如果你正在編寫程序,main甚至可能不存在。

但是,一個程序總是可以信任的,以便在ELF頭中聲明的入口點地址處開始(假設它是一個ELF可執行文件)。所以,使用它。 readelf可以告訴你的價值。

+0

是'_start_'保證在單個系統上處於相同的EIP? –

+0

也不,對不起。 – nneonneo

+0

它比這更復雜一點。動態ELF可執行文件實際上引用了ELF解釋器,它實際上是動態庫加載器('ld.so'或'ld-linux-x86-64.so'),它在運行時啓動並加載'libc.so'可執行文件。 –

相關問題