特殊函数 _init 和 _fini 的分段错误
segmentation fault by Special functions _init and _fini
出于观察目的,我使用 _start()、_init()、_fini() 编写了一个程序,目标是不使用启动文件。
代码如下
#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()只是在处理库的时候用到的???
请
_start
例程不能 return。通常,它调用 __libc_start_main
而调用 main
。然后当main
returns时,__libc_start_main
调用exit
,return值为main
。
由于您是自己定义 _start
而不是调用 __libc_start_main
,因此您需要明确调用 exit
。你得到一个 sigfault,因为该函数不应该 return.
有关详细信息,请参阅 。
出于观察目的,我使用 _start()、_init()、_fini() 编写了一个程序,目标是不使用启动文件。 代码如下
#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()只是在处理库的时候用到的??? 请
_start
例程不能 return。通常,它调用 __libc_start_main
而调用 main
。然后当main
returns时,__libc_start_main
调用exit
,return值为main
。
由于您是自己定义 _start
而不是调用 __libc_start_main
,因此您需要明确调用 exit
。你得到一个 sigfault,因为该函数不应该 return.
有关详细信息,请参阅