免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 61604 | 回复: 131
打印 上一主题 下一主题

高手必看:程序出了main()入口外还有其它的吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-05 11:27 |只看该作者 |倒序浏览
程序除了main()入口外还有其它的吗,请举例,这对我太重要了!!!!!!愿以死相报,急!!

[ 本帖最后由 junenggai 于 2006-4-5 11:34 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-04-05 11:37 |只看该作者
我不想杀人……

对于 C++ 来说,全局对象的构造就是在 main 之前发生的。
对于标准 C 来说,main 是唯一的入口,不过很多编译器都有参数可以自己指定入口,具体详情参见编译器的手册。

[ 本帖最后由 flw 于 2006-4-5 11:43 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-04-05 11:44 |只看该作者
对,有些编译器可以指定其他入口的。

论坛徽章:
0
4 [报告]
发表于 2006-04-05 11:45 |只看该作者
之所以大多数程序的“入口”是 main,是因为连接器缺省会连接一个叫 crt0.o 或者 crt0.lib 之类的库,这个库才是一个程序真正的入口,这个真正的入口作了一段初始化之后将控制权交给 main。大多数情况下用户程序不会自己初始化这些东西,所以缺省连接这个库。

如果你自己完成这部分初始化,完全可以抛弃 main。

main 不是程序的入口,只不过是一个普通的符号而已。

论坛徽章:
0
5 [报告]
发表于 2006-04-05 11:49 |只看该作者
又长见识了

论坛徽章:
0
6 [报告]
发表于 2006-04-05 11:59 |只看该作者
以前有个帖子是关于如何让valgrind支持线程
隐约记得里头用到了一个gcc特有的宏
该宏可以使一个函数在main之前就执行
具体的我也记不得了

论坛徽章:
0
7 [报告]
发表于 2006-04-05 12:35 |只看该作者

回复 4楼 0521 的帖子

作点补充:
   在每个c程序中crtl.o启动例程(在目标文件中)的伪代码
      0x080480c0<_start>
                   call  _libc_init_first
                   call  _init
                   call  atexit
                   call  main              //改变入口点,应该就是改变了这条语句?
                   call  _exit

[ 本帖最后由 wz_uestc 于 2006-4-5 12:37 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-04-05 12:40 |只看该作者
原帖由 0521 于 2006-4-5 11:45 发表
之所以大多数程序的“入口”是 main,是因为连接器缺省会连接一个叫 crt0.o 或者 crt0.lib 之类的库,这个库才是一个程序真正的入口,这个真正的入口作了一段初始化之后将控制权交给 main。大多数情况下用户程序不 ...

你说的话基本上是正确的,不过概念有些混淆。
看来你还没有搞清楚 entry 和 stub/wrap 的区别。
按照你这个说法,真正的入口也不是 crt0.o 或者 crt0.lib 或者 librt.so,而是 loader,
甚至是 fork() 再或者是 fork_init()。再或者是系统 BIOS,再或者通俗一点说就是电源开关。

[ 本帖最后由 flw 于 2006-4-5 12:41 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-04-05 13:04 |只看该作者

回复 8楼 flw 的帖子

不明白,改变程序的入口点有什么意义呢????

论坛徽章:
0
10 [报告]
发表于 2006-04-05 13:10 |只看该作者
原帖由 flw 于 2006-4-5 12:40 发表

你说的话基本上是正确的,不过概念有些混淆。
看来你还没有搞清楚 entry 和 stub/wrap 的区别。
按照你这个说法,真正的入口也不是 crt0.o 或者 crt0.lib 或者 librt.so,而是 loader,
甚至是 fork() 再或者 ...



跟电源开关有啥关系?
操作系统总要执行一个类似 fork() 的东西。创建一个进程。然后呢,它会从内核空间 “跳转” 到用户空间。用户空间的执行的第一条汇编指令我称为“入口”,不知道这么说没说明白。那 flw 把什么称为入口呢?

赐教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP