【发布时间】:2017-07-08 18:20:49
【问题描述】:
我正在尝试在C 中不使用main() 函数来编译和运行以下程序。我已经使用以下命令编译了我的程序。
gcc -nostartfiles nomain.c
编译器给出警告
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400340
好的,没问题。然后,我运行了可执行文件(a.out),printf 语句都打印成功,然后得到 segmentation fault。
所以,我的问题是,为什么在成功执行打印语句后出现分段错误?
我的代码:
#include <stdio.h>
void nomain()
{
printf("Hello World...\n");
printf("Successfully run without main...\n");
}
输出:
Hello World...
Successfully run without main...
Segmentation fault (core dumped)
注意:
这里,-nostartfiles gcc 标志阻止编译器在链接时使用标准启动文件
【问题讨论】:
-
我很惊讶这完全有效。坦率地说,我认为链接器的这种处理是错误的(或者至少是一件坏事):没有入口点,所以链接器只是从任何方便的功能中产生幻觉。布莱赫。
-
@imallett,至少链接器很友好地通过警告引起了人们的注意,并解释了它正在采取的后备行动!你是对的,不过,这可能是一个错误而不是一个警告更好。
-
为什么不使用 main?
-
@PieterB - 与有关 unices 的讨论不太相关,但 Windows 程序的入口点不一定是
main,而是WinMain或wWinMain。 -
@StoryTeller 实际上在 Windows 和 Linux 中都可以设置任意入口点:对于 Linux 的
ld它将是-e选项,对于 Windows 的 MSVC 链接器它将是/ENTRY选项。
标签: c gcc segmentation-fault main gcc-warning