在 C 中的 main() 函数之前打印 "Hello world"
Print "Hello world" before main() function in C
从 Quora 复制的以下程序,在 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);
}
然后,我在 Ubuntu-14.04 GCC 编译器上使用以下命令编译了上面的程序
gcc -nostartfiles hello.c
和运行a.out
可执行文件,但是我得到Segmentation fault (core dumped)
?那么,为什么 分段错误 ?
_start
是可执行文件的真正入口点,通常由 C 运行时采用它来初始化其内容 - 包括 stdio -,调用标有 constructor
属性的函数,然后调用你的main
入口点。如果你接受它并尝试使用标准库中的东西(例如 printf
),你的生活很危险,因为你正在使用尚未初始化的东西。
然而,您可以 做的是完全绕过 C 运行时,并使用直接系统调用打印,例如 write
。
从 Quora 复制的以下程序,在 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);
}
然后,我在 Ubuntu-14.04 GCC 编译器上使用以下命令编译了上面的程序
gcc -nostartfiles hello.c
和运行a.out
可执行文件,但是我得到Segmentation fault (core dumped)
?那么,为什么 分段错误 ?
_start
是可执行文件的真正入口点,通常由 C 运行时采用它来初始化其内容 - 包括 stdio -,调用标有 constructor
属性的函数,然后调用你的main
入口点。如果你接受它并尝试使用标准库中的东西(例如 printf
),你的生活很危险,因为你正在使用尚未初始化的东西。
然而,您可以 做的是完全绕过 C 运行时,并使用直接系统调用打印,例如 write
。