本文主要参考程序入口函数和glibc及C++全局构造和析构
glibc的启动代码起始于sysdeps/i386/start.S中的_start函数
_start:
/*置ebp为0*/
xorl %ebp, %ebp
/*弹出argc至esi*/
popl %esi
/*至ecx为argv*/
movl %esp, %ecx
/*地址为16的倍数*/
andl $0xfffffff0, %esp
/*放入eax的值*/
pushl %eax
/*** 放入当前的esp至栈中,pushl先执行-4在执行放入数据 ***/
pushl %esp
pushl %edx
/******/
pushl $__libc_csu_fini
pushl $__libc_csu_init
pushl %ecx
pushl %esi
pushl $BP_SYM (main)
call BP_SYM (__libc_start_main)
hlt
_start:
获取栈中的argc,从esp获取argv,调整esp值,并将获取的数据与函数地址压入栈中。start最后调用_lib_start_main。
lib_start_main位于csu/Lib_start.c文件中: