Linux C++ main函数执行流程

测试代码

#include 
int main() {
  printf("hello world! \n");
  printf("again hello world! \n");
  return 0;
}

编译

gcc helloworld.c -o helloworld
ls
a.out  helloworld  helloworld.c
objdump -Sd helloworld
ls -lthr

调试glibc

  • 1.Entry point address 程序入口地址( 通过 readelf -h 可执行文件)


    image.png
  • 2.查看汇编源代码 (objdump -d 可执行文件 / objdump -Sd 可执行文件)
image.png
image.png
  • 3.Entry point address -> <_start> libc调用
  • 4.<_start> -> __libc_start_main@plt 在执行文件里面 (glibc start.S call *__libc_start_main@GOTPCRE(%rip)
  • 5.libc_start.c -> LIBC_START_MAIN -> __lib_early_init(true) -> call_init -> _libc_start_call_main
  • 6.libc_start_call_main.h -> exit(main(argc, argv, MAIN_AUXVEC_PARAM)); 设置argc argv 环境变量。

char** char**
注意:

  • main函数之前的静态变量在哪里初始化的?call init -> main -> call fini


    image.png
image.png
  • init函数可以提前初始化initialize profiling (非入侵 / 注入)
image.png

image.png

你可能感兴趣的:(Linux C++ main函数执行流程)