gpt4 book ai didi

c - 特殊函数 _init 和 _fini 的段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:22 27 4
gpt4 key购买 nike

出于观察目的,我使用 _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 例程无法返回。通常,它调用 __libc_start_main 调用 main。然后当 main 返回时,__libc_start_mainmain 的返回值调用 exit

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

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

关于c - 特殊函数 _init 和 _fini 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com