Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“打印”;“你好,世界”;C中的before main()函数_C_Gcc_Segmentation Fault_Main_Startup - Fatal编程技术网

“打印”;“你好,世界”;C中的before main()函数

“打印”;“你好,世界”;C中的before main()函数,c,gcc,segmentation-fault,main,startup,C,Gcc,Segmentation Fault,Main,Startup,下面的程序是从中复制的,它在main()函数之前打印“Hello world” #include <stdio.h> #include <unistd.h> int main(void) { return 0; } void _start(void) { printf ("hello, world\n"); int ret = main(); _exit (ret); } 并运行了a.out可执行文件,但我得到了分段错误(内核转储)?那么,为什么分段

下面的程序是从中复制的,它在
main()
函数之前打印“Hello world”

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  return 0;
}

void _start(void)
{
  printf ("hello, world\n");
  int ret = main();
  _exit (ret);
}

并运行了
a.out
可执行文件,但我得到了
分段错误(内核转储)
?那么,为什么分段错误是可执行文件的真正入口点呢?

\u start
是可执行文件的真正入口点,通常由C运行时来初始化它的内容(包括stdio),调用标记有
构造函数
属性的函数,然后调用
主入口点。如果你拿着它,试图使用标准库中的东西(比如
printf
),你的生活是危险的,因为你使用的是尚未初始化的东西


但是,您可以做的是完全绕过C运行时,并使用直接的系统调用进行打印,例如
write

为什么出现分段错误?
您是否尝试过使用调试器?答案可能取决于libc实现的深度,但glibc是开源的,您不应该有任何问题。显然,您需要安装
libc6 dbg
(或
libc dbg
)来获取调试信息。您是否在Linux系统上使用
gcc
?是的,我在Ubuntu上使用gcc。在C中,执行从
main
开始。任何让程序在
main
之前执行的操作都超出了C的范围。
gcc -nostartfiles hello.c