ELF文件入口點之後的執行流程

以上上篇文章中的test爲例,先看入口點函數start( ):

前輩已給出調用順序:

1、start( )->__libc_start_main( )

2、__libc_start_main( )->init( )->main( )->fini( )->rtld_fini( )->exit( )

init( ):用於C++全局對象構造

main( ):你自己寫的函數

fini( ):用於C++全局對象析構

 

經過查看/lib/i386-linux-gnu/libc-2.23.so文件中__libc_start_main( )函數代碼,未發現調用fini( )、rtld_fini( )函數,如下:

main( )函數調用之後緊接着就是exit( )調用

經過動態調試證實fini( )、rtld_fini( )函數確實沒有執行。

 

gdb調試過程中一些指令記錄做以後參考:

顯示__libc_start_main( )函數的7個參數:x  /7xw    內存地址

依次是:main( )地址   argc   argv   init( )地址   fini( )地址    rtld_fini( )地址     stack_end

顯示程序參數:x  /sb  內存地址

關於main函數參數可以看

https://blog.csdn.net/singleyellow/article/details/78942853

https://blog.csdn.net/singleyellow/article/details/78895108

設置默認彙編語言編碼與ida相同:set disassembly-flavor intel

顯示彙編代碼同時顯示對應內存數據:disassemble  -r  

如果不知道庫函數的地址,可以直接用b 函數名,比如:b  __libc_start_main( )

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章