出于观察目的,我使用_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()仅在处理库时使用? 请
答案 0 :(得分:1)
_start
例程无法返回。通常情况下,它会调用__libc_start_main
来调用main
。然后,当main
返回时,__libc_start_main
调用exit
,返回值为main
。
由于您自己定义_start
而未调用__libc_start_main
,因此您需要明确调用exit
。你得到了一个sigfault,因为预计这个函数不会返回。
有关详细信息,请参阅this question。