在main开始前和结束后(转)

转:Linux下的ELF文件、链接、加载与库

 

我们有两个C代码:

// entry.c
#include <stdio.h>

__attribute((constructor)) void before_main()
{ printf("%s\n",__FUNCTION__); }

int main() {
    printf("%s\n",__FUNCTION__);
}


// atexit.c
#include <stdio.h>

void post(void)
{
    printf("goodbye!\n");
}

int main()
{
    atexit(&post);
    printf("exiting from main\n");
}

分别编译运行这两个程序,输出结果分别为:

# entry.c
before_main
main
# atexit.c
exiting from main
goodbye!

可见,在main开始前和结束后,其实还有一部分程序在运行。

事实上操作系统装载程序之后首先运行的代码并不是我们编写的main函数的第一行,而是某些运行库的代码,它们负责初始化main函数正常执行所需要的环境,并负责调用main函数,并且在main返回之后,记录main函数的返回值,调用atexit注册的函数,最后结束进程。以Linux的运行库glibc为例,所谓的入口函数,其实 就是指ld 默认的链接脚本所指定的程序入口_start (默认情况下)。

 

posted @ 2022-08-03 10:37  酒醉的Tiger  阅读(37)  评论(0编辑  收藏  举报