_start, __libc_start_main, main
hello를 출력하는 hello
C언어로 작성한 간단한 elf파일의 헤더를 보면 실행파일의 시작주소값인 Entry point address에 _start 의 주소가 들어있는가 있다. 프로그램을 실행하면 _start함수부터 실행이 될것이다. 따라가보장
그 전에 _start함수가 호출되기 전의 스택에는 hello의 argc, argv, env값이 들어가있다.(커널이 구성한다.)
_start함수는 그냥 인자(argv, argc,..)들을 스택에 넣어주고 __libc_start_main을 호출
(gdb로 따라가다보면 __libc_start_main를 처음 호출하는거라 바로 호출안하고 plt에서 got쓰는 다이나믹 링킹하고 호출)
int __libc_start_main( int (*main) (int, char * *, char * *),
int argc, char * * ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end));
env.
__libc_csu_init 호출
_init 호출
gmon 프로파일링 시스템초기화를 위한 call_gmon_start호출(필요하다면)
익셉션 처리를 위한 unwinding stack을 설정하기 위해 frame_dummy를 호출
생성자를 호출하는 __do_global_ctors_aux를 호출
(생성자가 코딩되어있으면 __do_global_ctors_aux안에서 호출)
__libc_start_main으로 돌아와서 main 함수 호출, hello 출력하고
exit호출, 소멸자 있으면 exit에서 소멸자 호출.
0 개의 댓글:
댓글 쓰기