junenggai 发表于 2006-04-05 11:27

高手必看:程序出了main()入口外还有其它的吗

程序除了main()入口外还有其它的吗,请举例,这对我太重要了!!!!!!愿以死相报,急!!

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

flw 发表于 2006-04-05 11:37

我不想杀人……

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

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

xiaofeng_jia 发表于 2006-04-05 11:44

对,有些编译器可以指定其他入口的。

0521 发表于 2006-04-05 11:45

之所以大多数程序的“入口”是 main,是因为连接器缺省会连接一个叫 crt0.o 或者 crt0.lib 之类的库,这个库才是一个程序真正的入口,这个真正的入口作了一段初始化之后将控制权交给 main。大多数情况下用户程序不会自己初始化这些东西,所以缺省连接这个库。

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

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

xiaofeng_jia 发表于 2006-04-05 11:49

又长见识了

bleem1998 发表于 2006-04-05 11:59

以前有个帖子是关于如何让valgrind支持线程
隐约记得里头用到了一个gcc特有的宏
该宏可以使一个函数在main之前就执行
具体的我也记不得了

wz_uestc 发表于 2006-04-05 12:35

回复 4楼 0521 的帖子

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

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

flw 发表于 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 编辑 ]

wz_uestc 发表于 2006-04-05 13:04

回复 8楼 flw 的帖子

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

0521 发表于 2006-04-05 13:10

原帖由 flw 于 2006-4-5 12:40 发表

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


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

赐教
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 高手必看:程序出了main()入口外还有其它的吗