ELF文件入口点之后的执行流程

以上上篇文章中的test为例,先看入口点函数start( ):

ELF文件入口点之后的执行流程

前辈已给出调用顺序:

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( )函数,如下:

ELF文件入口点之后的执行流程

main( )函数调用之后紧接着就是exit( )调用

ELF文件入口点之后的执行流程

经过动态调试证实fini( )、rtld_fini( )函数确实没有执行。

 

gdb调试过程中一些指令记录做以后参考:

显示__libc_start_main( )函数的7个参数:x  /7xw    内存地址

ELF文件入口点之后的执行流程

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

显示程序参数:x  /sb  内存地址

ELF文件入口点之后的执行流程

关于main函数参数可以看

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

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

设置默认汇编语言编码与ida相同:set disassembly-flavor intel

显示汇编代码同时显示对应内存数据:disassemble  -r