c语言如何调用程序,在C中,main()方法最初是如何调用的?

操作系统调用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是什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值