以上上篇文章中的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( )