【发布时间】:2013-04-10 07:16:43
【问题描述】:
你能帮我理解一下如何
__start
在C内部使用?
它是main 函数的精确副本还是编译程序的入口点?
只是想知道,它是如何被使用的?
【问题讨论】:
-
您能给我们一些背景信息吗?你在哪里看到
__start? -
它是入口点。
你能帮我理解一下如何
__start
在C内部使用?
它是main 函数的精确副本还是编译程序的入口点?
只是想知道,它是如何被使用的?
【问题讨论】:
__start?
Here 很好地概述了程序启动期间发生的情况之前 main。特别是,它表明__start 是实际的入口点,从操作系统的角度来看,您的程序。
这是instruction pointer 在您的程序中开始计数的第一个地址。
那里的代码调用一些 C 运行时库例程只是为了做一些内务处理,然后调用您的 main,然后关闭并使用返回的退出代码 main 调用 exit。
一张图抵千言:
【讨论】:
根据 C/C++ 标准,main() 是程序的起点。如果您使用的是 GCC,_start 函数是调用 main() 的 C 程序的入口点。 _start()函数的主要工作是执行一些初始化任务。
// $ gcc program_entry.c -nostartfiles
// $ ./a.out
// custom program entry
#include <stdio.h>
#include <stdlib.h>
void program_entry(void);
void
_start(void)
{
program_entry();
}
void
program_entry(void)
{
printf("custom program entry\n");
exit(0);
}
如果需要,也可以在 GCC 中使用-e 开关编译程序入口。
// $ gcc program_entry.c -e __start
// $ ./a.out
// custom program entr
#include <stdio.h>
void program_entry(void);
void
_start(void)
{
program_entry();
}
void
program_entry(void)
{
printf("custom program entry\n");
}
【讨论】:
_start 是一个操作系统函数......它是任何程序的入口点......因为我们的编译器知道 main(main 不是预定义的函数,它是用户定义的,但所有编译器都知道它们)这个 _start函数将调用 main ,然后我们的程序进入 CPU
【讨论】: