#include <stdio.h>
#include <stdlib.h>

static void before(void) __attribute__ ((constructor));
static void after(void) __attribute__ ((destructor));
static void middle(void);

static void before()
{
        fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}

static void after()
{
        fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}

static void middle()
{
        fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
int main(void)
{
        atexit(middle);
        return 0;
}

通过指定
static void before(void) __attribute__ ((constructor));
表明这个函数应该在main之前执行

static void after(void) __attribute__ ((destructor));
表明函数在main之后执行

atexit表明函数在退出的时候执行