免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: junenggai
打印 上一主题 下一主题

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

论坛徽章:
0
121 [报告]
发表于 2007-08-28 15:18 |只看该作者
学到好多知识,也留个脚印。

论坛徽章:
0
122 [报告]
发表于 2007-10-08 11:26 |只看该作者
原帖由 flw 于 2007-4-13 12:36 发表

计算机从启动 BIOS、OS、shell、到运行应用程序,是一个连续的过程,每一步操作都有它的前驱。
作为本帖来说,我在 2 楼给出的答案应该算得上是标准答案——事实上我回帖的那一刹那根本没想到这个帖子会扯这 ...


又重新看了一边, 真是忍不住发个言,这篇帖子居然能从程序的入口讨论到变为一片进阶的计算机科普读物啊。

论坛徽章:
0
123 [报告]
发表于 2007-10-08 11:37 |只看该作者
原帖由 hellioncu 于 2006-4-6 10:03 发表
别搞了半天面试官想要的答案是Windows的入口如WinMain、_tMain之类的


哎,别说!! 想了一下,真的可能啊。

象各位版主,这样的水平,谁还会出来出面试题啊!

论坛徽章:
0
124 [报告]
发表于 2007-10-12 15:02 |只看该作者
当然还有   编译器可以指定入口

就和汇编一样 也可以不丛start开始

论坛徽章:
0
125 [报告]
发表于 2007-10-12 16:00 |只看该作者
其实main只是你从应用程序源代码的角度看到的程序的入口。而在生成可以被某种OS识别的可执行档(PE or COFF or ELF)之前,linker会给这个文件加上一些附加的信息,其中就包括给main加一个wrapper. 而这个wrapper的第一条指令的地址,就叫做ENTRY,才是一个程序真正意义上的入口。wrapper的流程可以参考crt0.o的源代码。他在调用main之前会配置好堆栈,初始化BSS段,用atexit注册析构函数等等。

而ENTRY实际上在链接阶段才被指定,然后写入到生成的可执行档的某一个field当中(细节到具体哪个field可以去参考具体可执行档的Specification)。

在MS和GNU下可以利用链接器来修改默认的ENTRY。

MS: link /ENTRY:symbol (这个symbol可以在应用程序的源代码里指定)

GNU: ld  --entry ADDRESS (这个ADDRESS可以在应用程序的源代码里指定) 当然,也可以修改link script的ENTRY()来定制

所以要修改main()这个"入口",可以有很多方式,比如修改crt0.o, 用上述选项来bypass crt0.o 等等...

Any Problem, 欢迎讨论!!!

论坛徽章:
0
126 [报告]
发表于 2007-10-12 16:33 |只看该作者
看了好几遍了

论坛徽章:
0
127 [报告]
发表于 2014-05-23 11:36 |只看该作者
既然来了,就把这座坟挖出来吧。这么多年过去了,我也遇到同样的问题了,目测是GHS的编译器版本差异导致:

[elxr] (error) unresolved symbols: 1   
__ghs_bmcisr_c         from crt0.o   

这个crt0.o是旧版本编译器里带的,现在直接放到新版本编译器上编译,出现找不到符合情况,
然后翻遍了C:\ghs\××××\lib 下的各个目录,找了一个能解决找不到符号问题的crt0.o,编译链接都过了,
可惜放到板子上跑不起来,蛋痛的问题。

GHS编译器都得花钱买的,流行的的那个破解版太老了,不支持我要用到的CPU。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
128 [报告]
发表于 2014-05-23 16:04 |只看该作者
我记得C的标准文本中有提到C的“执行环境”这么个说法。因不同的“执行环境”,可能造成不同的执行结果。这也就是POSIX存在的理由之一。统一执行环境。以达到执行结果可以预期。
还有。我总结的操作系统就是为这些模块提供“执行环境”。因此要实现操作系统,如果某个模块使用了编译环境中的库不要紧,该模块也可以成为操作系统的一部分。只要为该模块提供与编译环境“兼容”的“执行环境”就可以了。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
129 [报告]
发表于 2016-07-01 20:39 |只看该作者
呵呵,还有这样的讨论贴啊!

0521说得不错,这要看是否链接C标准库:

当C程序链接C标准库时,程序的入口由C标准库定义(一般是start),并由C标准库调用main函数!

当C程序不链接C标准库时,程序员可自行定义入口(可用也可不用start,甚至可用中文入口!)并完成初始化代码(同样的,可调用也可不调用main,甚至可调用中文主函数),编译后在链接可执行文件时通知链接器即可,入口地址将写入可执行文件中

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
130 [报告]
发表于 2016-07-04 11:58 |只看该作者
关于编译与链接,其实国内已有不少书籍(翻译与原创的都有),比读En文方便多了,讲得还是比较深入的,了解基本原理后,举一反三不成问题(如增加中文支持,升级到64位版本...等等)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP