特殊功能_init和_fini进行分段故障

时间:2015-09-08 12:21:33

标签: c gcc compilation init

出于观察目的,我使用_start(),_ init(),_ fini()编写了一个程序,目标是不使用startfiles。 代码如下

#include <stdio.h>
void test()
{
printf("\n%s: \n",__func__);
printf("library test routine invoked\n");
int a=3,b=2;
int sum=a+b;
printf("sum=%d\n",sum);
getchar();
_fini();
}

int _start()
{
printf("\n%s: \n",__func__);
printf("in library start routine\n");
test();
return 0;
}
int _init()
{
printf("\n%s: \n",__func__);
printf("in library init routine\n");
return 0;
}

int _fini()
{
printf("\n%s: \n",__func__);
printf("in library fini routine\n");
return 0;
}

遵守

  

gcc -nostartfiles test.c -o test

,输出

_start: 
in library start routine

test: 
library test routine invoked
sum=5
l

_fini: 
in library fini routine
Segmentation fault (core dumped)

这里我想知道为什么可执行文件给出了分段错误?我需要指定,因为它是程序的结束?如果是这样,怎么样? 可以做些什么来克服分段错误? 另一个问题是这些_start(),_ init(),_ fini()仅在处理库时使用? 请

1 个答案:

答案 0 :(得分:1)

_start例程无法返回。通常情况下,它会调用__libc_start_main来调用main。然后,当main返回时,__libc_start_main调用exit,返回值为main

由于您自己定义_start而未调用__libc_start_main,因此您需要明确调用exit。你得到了一个sigfault,因为预计这个函数不会返回。

有关详细信息,请参阅this question