| 会飞的猪 |
 |
| 等级: |
| 权限:贵宾 |
| 积分:-1119 |
| 金钱:-980 |
| 声望:-16 |
| 经验:-1254 |
| 发帖数:907 |
| 注册:2006年10月1日 |
|
资料 短消息 | 2007-10-24 16:29:47 |
|
|
◆ 程序除了main()入口外还有其它的吗,请举例,这对我太重要了!!!!!!愿以死相报,急!!
[ 本帖最后由 junenggai 于 2006-4-5 11:34 编辑 ]
◆ ◆ 我不想杀人……
对于 C++ 来说,全局对象的构造就是在 main 之前发生的。
对于标准 C 来说,main 是唯一的入口,不过很多编译器都有参数可以自己指定入口,具体详情参见编译器的手册。
[ 本帖最后由 flw 于 2006-4-5 11:43 编辑 ]
◆ ◆ 对,有些编译器可以指定其他入口的。
◆ ◆ 之所以大多数程序的“入口”是 main,是因为连接器缺省会连接一个叫 crt0.o 或者 crt0.lib 之类的库,这个库才是一个程序真正的入口,这个真正的入口作了一段初始化之后将控制权交给 main。大多数情况下用户程序不会自己初始化这些东西,所以缺省连接这个库。
如果你自己完成这部分初始化,完全可以抛弃 main。
main 不是程序的入口,只不过是一个普通的符号而已。
◆ ◆ 又长见识了
◆ ◆ 以前有个帖子是关于如何让valgrind支持线程
隐约记得里头用到了一个gcc特有的宏
该宏可以使一个函数在main之前就执行
具体的我也记不得了
◆ ◆ 作点补充:
在每个c程序中crtl.o启动例程(在目标文件中)的伪代码
0x080480c0<_start>
call _libc_init_first
call _init
call atexit
call main //改变入口点,应该就是改变了这条语句?
call _exit
[ 本帖最后由 wz_uestc 于 2006-4-5 12:37 编辑 ]
◆ ◆
QUOTE:原帖由 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 编辑 ]
◆ ◆ 不明白,改变程序的入口点有什么意义呢????
◆ ◆
QUOTE:原帖由 flw 于 2006-4-5 12:40 发表
你说的话基本上是正确的,不过概念有些混淆。
看来你还没有搞清楚 entry 和 stub/wrap 的区别。
按照你这个说法,真正的入口也不是 crt0.o 或者 crt0.lib 或者 librt.so,而是 loader,
甚至是 fork() 再或者 ... 跟电源开关有啥关系?
操作系统总要执行一个类似 fork() 的东西。创建一个进程。然后呢,它会从内核空间 “跳转” 到用户空间。用户空间的执行的第一条汇编指令我称为“入口”,不知道这么说没说明白。那 flw 把什么称为入口呢?
赐教
◆ ◆ ◆ 真是长见识,我面试时出的题目,谢了诸大虾,我还是好好活着吧
◆ ◆
QUOTE:原帖由 wz_uestc 于 2006-4-5 13:04 发表
不明白,改变程序的入口点有什么意义呢???? 举个简单的例子,如果你想自己写操作系统,难道要连接表准的函数库吗?这些函数库可是操作系统相关的。
◆ ◆ 真是长见识,我面试时出的题目,谢了诸大虾,我还是好好活着吧
◆ ◆ 老大。。。
一个破面试题至于‘以死相报’阿
◆ ◆
QUOTE:原帖由 0521 于 2006-4-5 13:10 发表
跟电源开关有啥关系?
操作系统总要执行一个类似 fork() 的东西。创建一个进程。然后呢,它会从内核空间 “跳转” 到用户空间。用户空间的执行的第一条汇编指令我称为“入口”,不知道这么说没说明白。那 ... 不摁电源开关,程序怎么启动?
所以说,所有的 software 的总入口,也是唯一入口,就是电源开关。
你把【用户空间的执行的第一条汇编指令】【称为“入口”】,我却认为,所谓的”用户空间“只不过是操作系统实现技术上的说法,C/C++ 语言不一定要跑在计算机里,在人脑里一样可以跑,所以说,我把 ANSI 规定的入口,也就是 main 或者全局变量的构造函数,称为入口,而你所谓的入口,只能叫“stub”,或者“wrap”,也就是对 C 程序的一层“包装”。
◆ ◆
QUOTE:原帖由 bleem1998 于 2006-4-5 11:59 发表
以前有个帖子是关于如何让valgrind支持线程
隐约记得里头用到了一个gcc特有的宏
该宏可以使一个函数在main之前就执行
具体的我也记不得了 兄弟, 我觉得你水平已经相当好了, 可惜总记不住东西, 不妨每得到新知识, 就写入电子文档, 或者自己的小程序里。 时间长了, 便是个不错的积累呢。
CODE: #include
#include
void foo() __attribute__ ((constructor));
int main()
{
return 0;
}
void foo()
{
printf("Hello from %s\n", __FUNCTION__);
}
◆ ◆ 我没有在人脑里跑程序的本事,我甘拜下风。
◆ ◆ flw 赐教了,另外我还觉得程序的入口是——猴子,因为计算机是人发明的,人是猴子变的。
◆ ◆ 不是任何一条指令扔给CPU,CPU都会无条件执行么???那么,能不能认为,把程序的第一条指令送给CPU的那一点是程序的真正入口呢?????
◆ ◆
QUOTE:原帖由 0521 于 2006-4-5 13:10 发表
跟电源开关有啥关系?
操作系统总要执行一个类似 fork() 的东西。创建一个进程。然后呢,它会从内核空间 “跳转” 到用户空间。用户空间的执行的第一条汇编指令我称为“入口”,不知道这么说没说明白。那 ... 大家别争吵, 只争论, 呵呵, 都友好一点嘛!
我觉得如果这么定义“入口”, 那么你说的crt0.o就不是入口, 而是loader, 在linux下, 即:/lib/ld-linux.so.2, 它才是OS从execve返回到用户态开始执行的第一条指令所在。
你觉得呢?
◆ ◆ ◆
QUOTE:原帖由 net_robber 于 2006-4-5 14:23 发表
不是任何一条指令扔给CPU,CPU都会无条件执行么???那么,能不能认为,把程序的第一条指令送给CPU的那一点是程序的真正入口呢????? >>不是任何一条指令扔给CPU,CPU都会无条件执行么??
当然不是。
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-5 14:30 发表
大家别争吵, 只争论, 呵呵, 都友好一点嘛!
我觉得如果这么定义“入口”, 那么你说的crt0.o就不是入口, 而是loader, 在linux下, 即:/lib/ld-linux.so.2, 它才是OS从execve返回到用户态开始执行 ... 这个没问题,我也这么觉得。
但我还是不想“觉得”开电源是程序的入口。
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-5 14:31 发表
>>不是任何一条指令扔给CPU,CPU都会无条件执行么??
当然不是。 那是什么情况呢???能稍微说的详细点么??想知道,呵呵
◆ ◆
QUOTE:原帖由 0521 于 2006-4-5 14:38 发表
这个没问题,我也这么觉得。
但我还是不想“觉得”开电源是程序的入口。 兄弟,看来我又不小心惹了你了。
可是我前面已经说过了,是 loader,呵呵。
谢谢你支持我的观点!
◆ ◆
QUOTE:原帖由 net_robber 于 2006-4-5 14:42 发表
那是什么情况呢???能稍微说的详细点么??想知道,呵呵 现代 CPU 都支持特权级的概念,当然了,叫法可能不同,ARM 下就不这么叫,叫模式。
不同的模式下,可用的指令集不同,所以不是任何一条指令都可以随便执行的。
◆ ◆ 原来是这样啊,呵呵,谢谢了
◆ ◆ 长知识
不过前面有几贴的意思我没看明白是争论还是吵架
所以要说loader是入口我个人感觉怪怪的
那些都是OS在执行一个用户程序前的例行公事吧?能算入口不
感觉所说程序入口是指用户所编写的程序到底从哪里开始执行,为程序入口这样是否更合理些?
◆ ◆
QUOTE:原帖由 艾斯尼勒 于 2006-4-5 15:06 发表
长知识
不过前面有几贴的意思我没看明白是争论还是吵架
所以要说loader是入口我个人感觉怪怪的
那些都是OS在执行一个用户程序前的例行公事吧?能算入口不
感觉所说程序入口是指用户所编写的程序到底从 ... 正是!
C 的代码是从 main 开始的,
C++ 的是从全局变量的构造函数开始的。
◆ ◆
QUOTE:原帖由 flw 于 2006-4-5 15:09 发表
正是!
C 的代码是从 main 开始的,
C++ 的是从全局变量的构造函数开始的。 没看懂!
◆ ◆ loader 是计算机启动的入口
说得再根本一点是bios
0x0000 开始的吧
main()是一般的应用程序的入口
这个入口名字在编译器中是可以修改的
个人理解
◆ ◆ ◆ >loader 是计算机启动的入口 说得再根本一点是bios
观点根本错误。 不过这个不是一两句话解释清楚的, 建议看Linker & Loader和OS 引导的知识
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-5 17:28 发表
>loader 是计算机启动的入口 说得再根本一点是bios
观点根本错误。 不过这个不是一两句话解释清楚的, 建议看Linker & Loader和OS 引导的知识 他说的 loader 是 os loader,比如 grub
◆ ◆ 这个入口还是要讲在什么层面上的吧。说着说着不能说到“世界的起源”这么哲学的问题上去了。讨论吗,解决问题。
不如这么说吧。
在c的级别上入口是main()
要是讨论起编译、链接(汇编级别)入口就是 -e entry --entry=entry可以指定的了。
要是在话题一转,讨论起操作系统的加载程序的过程。估计就和exec之类的调用有关了,就涉及到什么ld.so之类的东东,估计还是在ELF文件头里面定义的,似乎还是上面-e entry指定的。
要是再往下。操作系统的入口,当然以linux为例,网上还是不少资料,推荐看《情景分析》
再往下到cpu这个级别的。当然是X86为例了,好像是从FFFF:0000-正好是在bios里面的。
再往下估计是主板上的“reset”信号引起了CPU的“reset”。
再往下,估计就跑题跑太远了。
◆ ◆ 我只知到main()涵数界束后还有另外一个涵数运行.不过是在dos的
◆ ◆ 有趣
发现很多争论主要是由于人们对同一词语有不同的定义。
◆ ◆
QUOTE:原帖由 白色乌鸦 于 2006-4-5 18:37 发表
有趣
发现很多争论主要是由于人们对同一词语有不同的定义。 非常赞同这句话。
所以说,自然语言很多时候并不是高效的交流工具,因此才有了各种形式语言……
包括计算机语言、数学语言、逻辑语言,等等……
◆ ◆
QUOTE:原帖由 白色乌鸦 于 2006-4-5 18:37 发表
有趣
发现很多争论主要是由于人们对同一词语有不同的定义。 赞同你的观点
◆ ◆
QUOTE:原帖由 tzwolf 于 2006-4-5 18:24 发表
这个入口还是要讲在什么层面上的吧。说着说着不能说到“世界的起源”这么哲学的问题上去了。讨论吗,解决问题。
不如这么说吧。
在c的级别上入口是main()
要是讨论起编译、链接(汇编级别)入口就是 -e en ... 同意
别的发言很多都在钻牛角尖, 或是卖弄。其实只是半瓢水。
◆ ◆ 看了这个帖子,越知道自己懂得的东西太少了.
另外, 在这个帖子里发言的许多人都让我佩服!
◆ ◆ 可以有其他入口,在VMS系统上我见过。当时调试的时候傻了,不知道入口在那个文件。
入口函数名和可执行文件名好像是一样的
◆ ◆ ◆ 人脑左(右)手按电源南桥芯片(给CPU启动信号)CPUBIOS操作系统(main)
◆ ◆ 比较同意flw,
但偶认为main或者在编译时指定的主函数是真正的入口。C++也不例外。执行的优先次序和入口没关系。
◆ ◆
QUOTE:原帖由 flw 于 2006-4-5 15:09 发表
正是!
C 的代码是从 main 开始的,
C++ 的是从全局变量的构造函数开始的。 真是强啊,我面试也遇到类似问题,问ANSI C的全局变量,局部变量,用MALLOC装载的动态数据空间,分别是什么时候初始化(如果程序里在定义这些变量是就进行初始化),这些变量分别存放在什么地方(我觉得这是操作系统内存管理的知识,他说是C语言的知识),请高手指点指点。
◆ ◆ 筒子们哪, 这个贴子还是成功滴! 看tzwolf yinheng8066 二位高人的处女贴都发在这里了, 可见是有技术含量的讨论
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-6 09:33 发表
筒子们哪, 这个贴子还是成功滴! 看tzwolf yinheng8066 二位高人的处女贴都发在这里了, 可见是有技术含量的讨论 我最崇拜的albcamus大哥也不小心开始灌水了。。。。
◆ ◆ 别搞了半天面试官想要的答案是Windows的入口如WinMain、_tMain之类的
◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 09:18 发表
比较同意flw,
但偶认为main或者在编译时指定的主函数是真正的入口。C++也不例外。执行的优先次序和入口没关系。 C++ 不是这样的,C++ 的全局变量是在 main 之前初始化的,因此,它们的构造函数也会在这之前运行。
◆ ◆
QUOTE:原帖由 flw 于 2006-4-6 10:30 发表
C++ 不是这样的,C++ 的全局变量是在 main 之前初始化的,因此,它们的构造函数也会在这之前运行。 支持flw老大. ,特地说过这个问题。
◆ ◆ 我被欺骗了,以为Lz有什么很深入的知识要共享呢!
◆ ◆ 大家回了这么多,估计要想LZ死啊,他可说了,要以死相报的啊
看了这么多贴都不是很懂,我感觉楼主是在问和main()类似的一个入口,而不是系统底层的一些入口吧。 楼主说除了main(),那就是说另一个入口应该也和main()差不多的,一个函数而已吧。
◆ ◆ ◆
QUOTE:原帖由 0521 于 2006-4-5 13:17 发表
举个简单的例子,如果你想自己写操作系统,难道要连接表准的函数库吗?这些函数库可是操作系统相关的。 这个说的比较好。
◆ ◆ 其实上面的牛人们都知道什么叫程序的开始,只是表达的方式不一样而已。
很显然,可以用编辑器写一个a.out,虽然我不知道具体的东西,但是这些都只是约定而已,而cc也紧紧是对.c生成符合约定的东西。而C标准以及OS告诉CC这个约定是什么。
就象标准输入和标准输出,对操作系统来说,它什么也不知道。所有的fd都是平行的,虽然可能各自有各自的特点。而在C中规定stdin stdout. 问题类似: 标准输入可以默认是/home/in吗
◆ ◆ 各种编译器可能都不一样,如果喜欢的话,估计很多都可以自己指定一个(vcc++ gcc是可以的),所谓的入口不过就是一个地址而已么
单片机里面的
ajmp $100
org 100
;start
mov ....
这里的start就是主程序入口地址
你也可以说那第一个执行的指令是入口,那上面的ajmp $100是入口的指令了
不过从另一方面看constructor虽然是先于main执行,但并不是入口
我的理由是你可以指定一个不叫main的函数为入口(entry point),但是你不能指定一个constructor为entry point
因为如果一个constructor可以做主程序做的一切,那么何不就把他做成一个main()呢?
所以constructor不是入口
入口可以不叫main,但是即便改叫别的名字,大多数情况下意义仍旧一样
除操作系统或其他特殊情况,没必要特殊化
◆ ◆
QUOTE:原帖由 john3851 于 2006-4-6 09:22 发表
真是强啊,我面试也遇到类似问题,问ANSI C的全局变量,局部变量,用MALLOC装载的动态数据空间,分别是什么时候初始化(如果程序里在定义这些变量是就进行初始化),这些变量分别存放在什么地方(我觉得这是操 ... 我也不是很懂,试着回答一下,说错了大家指正。
全局变量在main执行之前初始化,局部变量和malloc的动态空间编译器不初始化,由程序员自己初始化为需要的值。
全局变量分配在数据段,局部变量分配在堆栈,malloc从堆中分配内存。
◆ ◆
QUOTE:原帖由 flw 于 2006-4-6 10:30 发表
C++ 不是这样的,C++ 的全局变量是在 main 之前初始化的,因此,它们的构造函数也会在这之前运行。 请写一个不包含main的C++程序看看?(另,别使用编译器指定别的主函数)。允许你写无限多个全局变量
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-6 09:33 发表
筒子们哪, 这个贴子还是成功滴! 看tzwolf yinheng8066 二位高人的处女贴都发在这里了, 可见是有技术含量的讨论 汗,就一个字,我也陪灌,水了
◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 15:21 发表
请写一个不包含main的C++程序看看?(另,别使用编译器指定别的主函数)。允许你写无限多个全局变量 请您先了解一些《逻辑》有关的常识,OK?
◆ ◆ 长见识啊~~~
◆ ◆
QUOTE:原帖由 flw 于 2006-4-6 15:30 发表
请您先了解一些《逻辑》有关的常识,OK? 虚心请教一下,能否说的详细一些?
我们现在说的是入口,请从此问题开始
◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 15:40 发表
虚心请教一下,能否说的详细一些?
我们现在说的是入口,请从此问题开始 我说的是,
C++ 中,全局对象的构造函数是在 main 之前执行的。
这句话最早出现在这个帖子的二楼,换言之,这个帖子从那时起,其实已经回答清楚了。
只不过后来大家还在继续讨论,我就多说了几句。
注意,我并没有说,C++ 程序可以不要 main。
所以你前面所说的
QUOTE:请写一个不包含main的C++程序看看?(另,别使用编译器指定别的主函数)。允许你写无限多个全局变量针对的不是我原先的命题。
你犯了《逻辑》里面的“偷换概念”的错误。
希望你能认识到这个问题,然后我才有和你讨论的必要。
◆ ◆ ◆ 我说的是,
C++ 中,全局对象的构造函数是在 main 之前执行的。
这句话最早出现在这个帖子的二楼,换言之,这个帖子从那时起,其实已经回答清楚了。
只不过后来大家还在继续讨论,我就多说了几句。
-----------------------
我不是说你说的这话有问题。我说的是我认为C/C++的入口就是main。至于全局对象构造函数会在main前执行,仅是次序问题,因为没有main,就不是主程序了,这自然是entry了。
至于"偷换概念"的问题,我的感觉倒是与版主您不同。我并不放为entry就一定是最先执行的。就象你讲过的最终不是要讲到开关上去?先后和入口不同。
车有门,但是有人先从顶棚出去,但是门还是在原来的位置。不知是否又犯了逻辑错误。
-------------
另,讨论问题还是和气一些。况且您还是版主。不要动不动就指责别人。说不定我还比你大些。
◆ ◆
QUOTE:原帖由 connet 于 2006-4-5 20:31 发表
同意
别的发言很多都在钻牛角尖, 或是卖弄。其实只是半瓢水。 我倒不觉得,这些人“卖弄”的越多,大家学到的就越多。即便是“满瓢水”,要是不给我们洒点出来,那也等于一点没有,反倒不如“半瓢水”了!
总之我认为争论得越凶就越好!
◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 15:57 发表
我说的是,
C++ 中,全局对象的构造函数是在 main 之前执行的。
这句话最早出现在这个帖子的二楼,换言之,这个帖子从那时起,其实已经回答清楚了。
只不过后来大家还在继续讨论,我就多说了几句。
------- ... 呵呵,你是个很敏感的人。
为什么这么说呢?
因为:
1,我前面发表的每一个帖子,都是以我个人的身份发表的,难不成我换个马甲?
2,我并没有说我比你大,我也没有说,谁的年龄大,谁就了不起,我现在承认你比我大,又能怎么样呢?
呵呵。
不和你说了,以免引起你的不快。
BTW:你在 61 楼的回复中,又犯了“偷换概念”的错误了,我实在是不好意思再和你讨论下去。
◆ ◆
QUOTE:原帖由 cuinantrue 于 2006-4-6 16:19 发表
QUOTE:原帖由 connet 于 2006-4-5 20:31 发表
同意
别的发言很多都在钻牛角尖, 或是卖弄。其实只是半瓢水。 我倒不觉得,这些人“卖弄”的越多,大家学到的就越多。即便是“满瓢水”,要是不给我们洒点出来,那也等于一点没有,反倒不如“半瓢水”了!
总之我认为争论得越凶就越好!我同意这个观点,
所谓“人外有人,天外有天”,其实每个人都是“半瓶水”,如果大家都觉得自己是“半瓶水”而不发表意见,
那 BBS 还有存在的意义吗?
◆ ◆ 还是不说了。
如果可以写出没有main的程序,自然先执行的就是入口。。。。
实在搞不懂,为什么给别人扣个帽子就可以和别人讨论。
>>>BTW:你在 61 楼的回复中,又犯了“偷换概念”的错误了,我实在是不好意思再和你讨论下去。
你不用不好意思,我倒是真不好意思了。让您误认为我在倚老卖老。不敢。偶对C/C++没什么研究。还是耐心当听众。
小声问一句,您现在在学习Perl,perl的入口是什么?
◆ ◆ 对了,想起楼上一位仁兄给的例子:
QUOTE:#include
#include
void foo() __attribute__ ((constructor));
int main()
{
return 0;
}
void foo()
{
printf("Hello from %s\n", __FUNCTION__);
}入口是foo()吗?
◆ ◆ 好了都消消气吧, 问题搞清楚了就行了,怎么个说法不重要, 重要的是理解本身。对不对?
给大家拽文2句, 聊博一笑:
1, 《莊子.外物篇》:“言者所以在意, 得意而忘言。” --解释一下, 你是去试图理解别人的话的意思的, 理解了意思, 忘掉他的话好了。
2, 《逻辑哲学论》:
QUOTE:我的命题可以这样来说名:理解我的人, 当他通过这些命题──根据这些命题──越过这些命题(他可以说是在爬上屋子之后把梯子扔掉了)时──终于知道是没有意思的。
他必须排除这些命题, 那时他才能正确的看世界。不过是个概念嘛, 没必要这么争
[ 本帖最后由 albcamus 于 2006-4-6 16:49 编辑 ]
◆ ◆ 楼上的,田伯光办事不力,被吊到树上了,你呢?
FYI:又到了周末了,aero 你到底联系上了没有?
◆ ◆
QUOTE:原帖由 flw 于 2006-4-6 16:50 发表
楼上的,田伯光办事不力,被吊到树上了,你呢?
FYI:又到了周末了,aero 你到底联系上了没有? 越来越不像话了。这是版主说的话吗?
是我把他吊上树的。你还好吧?
◆ ◆ 想明白你为啥会有这么奇怪的需求?
能否给出context?
◆ ◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 16:52 发表
越来越不像话了。这是版主说的话吗?
是我把他吊上树的。你还好吧? flw的意思是说, 我还没定好到底哪天聚会──是我们几个人之间的玩笑, 不是针对你, 别误会了哈
◆ ◆
QUOTE:原帖由 ouland 于 2006-4-6 16:52 发表
越来越不像话了。这是版主说的话吗?
是我把他吊上树的。你还好吧? 自作多情,我是在说你吗?
◆ ◆ 厉害!
◆ ◆ 版主,说话不要那么带剌。。。。。。。偶没那爱好。误会是误会。误会了我道歉。你这么说话显然有点~~~~想灌水?
:D:D
◆ ◆
QUOTE:原帖由 albcamus 于 2006-4-5 13:49 发表
[code]
#include
#include
◆ ◆ 硬件有架构,os有架构,编译器有架构,程序也有架构
◆ ◆ 从汇编语言看,没有什么函数入口的概念。都是跳转指令。C语言给了一个默认的入口,但只是默认的而已。在vc中可以指定其他函数入口的。本质就是告诉rt库初始化后从哪里执行。
◆ ◆ 对于标准的 c,我觉得还是把 main () 当作入口好一点
loader/fork () 可以被当作入口,不过这个入口,恐怕就和你的源程序是 c/c++, fortran, pascal 什么的,没什么关系了吧?恐怕无论用哪种语言,编译连接出来的可执行程序都使用同样的 loader 吧?
从 !!c 语言!! 的角度(而不是 pascal, fortran)看,main () 看作入口点是符合逻辑,前后一致的
◆ ◆ 哈哈,非常同意 —— 程序入口就是电源!
◆ ◆ char main = '\xc3';
◆ ◆ ◆ 也不是这样改写入口吧
看来是落伍了
◆ ◆ 在VXWORKS下,任何函数都可以做为程序的入口!
◆ ◆ 在ARM的ADS中,也是任何函数都可以作为入口,并非只有main(),只要用汇编语句跳到那个函数即可。PC机上编译器隐藏封装了比较多的内容,所以容易让人看不到全貌
◆ ◆ c里面除了main可能没有了吧!(呵呵,俺水平有限,只知道main,^_^)
不过在linux设备驱动中又其他出口函数!^_^…………
◆ ◆ 还有:int main(int argc,char *argv[]);
int main(int argc,char *argv[],char **env);
另外还有如图形界面的GUI:WinMain();
◆ ◆ 一直不想回这个话题,我觉得很多回复的人都在没有给入口找一个准确定义的基础上回答的。
本来,内核如何加载和C语言是两码事,为什么很多人却混为一谈?
[ 本帖最后由 cjaizss 于 2006-4-30 14:22 编辑 ]
◆ ◆ 我以前看过个关于反汇编的例子,上面说程序的入口是加栽函数,不知道是不是.
◆ ◆ ◆ 呵呵,我记得原先的时候在基于德州仪器的DSP芯片上写驱动的时候,用的是C32汇编,那个程序的入口就是个lable,你写成什么就是什么,呵呵!
◆ ◆ 这个怎么又被顶出来了
◆ ◆ 我晕,好久没有用main函数了,忘了!
vxworks不用main!哈哈!
◆ ◆ 学习。。。
◆ ◆ 顶你个肺
还是珍惜生命吧
程序写不写都无所谓的
◆ ◆ 有一年多的时间没有弄程序了.
我不知道用什么方法可以更改或者得到编译器的入口参数.
我个人的理解是:
在C,或者是其他语言中.main() 作为入口只是针对编译器而言.就跟我的名字一样.你要通过喊这几个字我才能知道你在喊我.
在内存中的某个片的第一个地址空间就是程序的入口.但是这个仅仅是对操作系统而言.
操作系统将这些地址(OS可认知,可管理的物理内存空间)中的电极状态用伪装代码(我们看的见大东西)的形式表现出来. 是mov 还是 101010(我忘记是好多了,反正不是这个).任何在这之上的程序都从这里开始周游于CPU和内存之间.
楼上上上上....的说起源于猴子..
flw一来就把讨论推向了高潮. 但是跑题目了.
其实我也跑题了!
◆ ◆
QUOTE:原帖由 agaonet 于 2006-11-28 01:34 发表
flw一来就把讨论推向了高潮. 但是跑题目了.我艹!
我跑题了?你到二楼看看我哪儿跑题了?
◆ ◆ 艹 这个字不经典啊. ... 我说的是后续讨论的.
◆ ◆ 都一年多的帖子了,又给翻出来了~~~~~
楼主说的是程序的入口,这里的程序应该是说用户自己的应用程序,而不是操作系统与用户应用程序打交道的接口吧?更不是硬件bios交给操作系统的接口吧?
◆ ◆ 又见高人
◆
|
|
|
|
|
|