操作系统调用main()函数。实际上,它通常调用另一个名为一个奇怪的东西,如_init。 C编译器将标准库链接到提供此操作系统定义的入口点的每个应用程序,然后调用main()。
编辑:显然,这不够详细和正确足够一些人。
许多Unix操作系统使用的Executable and Linkable Format (ELF)定义了一个入口点地址。这就是程序在操作系统完成其exec()调用后开始运行的地方。在Linux系统上,这是_init。
从objdump -d:
Disassembly of section .init:
08049f08 <_init>:
8049f08: 55 push %ebp
8049f09: 89 e5 mov %esp,%ebp
8049f0b: 83 ec 08 sub $0x8,%esp
8049f0e: e8 a1 05 00 00 call 804a4b4
8049f13: e8 f8 05 00 00 call 804a510
8049f18: e8 d3 50 00 00 call 804eff0 <__do_global_ctors_aux>
8049f1d: c9 leave
8049f1e: c3 ret
从readelf -d:
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8049f08
0x0000000d (FINI) 0x804f018
0x00000004 (HASH) 0x8048168
0x00000005 (STRTAB) 0x8048d8c
0x00000006 (SYMTAB) 0x804867c
0x0000000a (STRSZ) 3313 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x8059114
0x00000002 (PLTRELSZ) 688 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x8049c58
0x00000011 (REL) 0x8049be0
0x00000012 (RELSZ) 120 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x8049b60
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0x8049a7e
0x00000000 (NULL) 0x0
您可以看到INIT等于_init的地址。
frame_dummy和__do_global_ctors_aux的代码位于一组名为crtbegin.o和crtend.o(以及这些名称的变体)的文件中。这些是GCC的一部分。该代码为C程序,如设置stdin,stdout,全局和静态变量和其他事情做各种必要的事情。
我相信别人的答案已经描述了Windows是什么。