【问题标题】:segmentation fault by Special functions _init and _fini特殊函数 _init 和 _fini 造成的分段错误
【发布时间】:2015-12-04 03:13:10
【问题描述】:

出于观察目的,我使用 _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()只在处理库时使用??? 请

【问题讨论】:

    标签: c gcc compilation init


    【解决方案1】:

    _start 例程无法返回。通常,它调用__libc_start_main,后者调用main。那么当main返回时,__libc_start_main调用exit,返回值为main

    由于您是自己定义_start 而不是调用__libc_start_main,因此您需要显式调用exit。您收到 sigfault 是因为该函数预计不会返回。

    更多详情请参阅this question

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 2018-04-10
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多