“打印”;“你好,世界”;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