gpt4 book ai didi

在 C 中编译和运行没有 main() 的程序

转载 作者:行者123 更新时间:2023-11-30 16:43:17 25 4
gpt4 key购买 nike

我正在尝试在 C 中编译并运行以下程序,而无需 main() 函数。我已经使用以下命令编译了我的程序。

gcc -nostartfiles nomain.c

编译器给出警告

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400340

好的,没问题。然后,我运行了可执行文件(a.out),两个printf语句都成功打印,然后得到段错误

所以,我的问题是,为什么成功执行打印语句后出现段错误?

我的代码:

#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 标志可防止编译器在链接时使用标准启动文件

最佳答案

我们来看看生成的assembly您的程序:

.LC0:
.string "Hello World..."
.LC1:
.string "Successfully run without main..."
nomain:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov edi, OFFSET FLAT:.LC1
call puts
nop
pop rbp
ret

请注意ret 语句。您的程序的入口点被确定为 nomain,一切都很好。但是,一旦函数返回,它就会尝试跳转到调用堆栈上的某个地址......该地址未填充。这是非法访问,随后会出现段错误。

一个快速的解决方案是在程序末尾调用 exit() (假设 C11 我们不妨将该函数标记为 _Noreturn):

#include <stdio.h>
#include <stdlib.h>

_Noreturn void nomain(void)
{
printf("Hello World...\n");
printf("Successfully run without main...\n");
exit(0);
}

事实上,现在您的函数的行为与常规 main 函数非常相似,因为从 main 返回后,会调用 exit 函数与 main 的返回值。

关于在 C 中编译和运行没有 main() 的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397351/

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