免费注册 查看新帖 |

Chinaunix

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

[C] main()函数如何访问argc,argv,envp [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-05 18:23 |只看该作者 |倒序浏览
如题,请教各位,main()函数如何通过ebp访问argc,argv和envp?有何出处?
多谢。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2014-05-05 19:04 |只看该作者
和其它函数一样的方式访问,
请看编译原理~~

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
3 [报告]
发表于 2014-05-05 20:59 |只看该作者
回复 2# folklore
不太理解,烦请楼上稍微解释一下?非常感谢


   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2014-05-05 23:16 |只看该作者
回复 3# superwujc


   
这个还是看书吧, 解释起来很麻烦。
上个函数呼叫的图。

简单的说就是ebp记录了当前局问部变量的开始位置。
ebp +4(说了ebp,认为是32位x86机)是返回地址,
ebp +8是第一个参数的地址,
ebp +12是第二个参数的地址如此等等。

具体要看编译器, 多少有些差异。比如ebp指向返回地址, epb-4才是第一个开始地址这类的。

论坛徽章:
0
5 [报告]
发表于 2014-05-06 14:57 |只看该作者
本帖最后由 ppdo 于 2014-05-06 14:59 编辑

回复 1# superwujc


    无视我的回答,我也不是很了解。

    但是我想,通过函数的call convention,可以知道调用中的内存组织,C语言的调用一般应该是如二楼所说的,先从左向右进参数,然后进return address,再压入epb,然后用当前的esp更新ebp,这个时候argc等参数应该跟正常参数一样,第一个是epb+8.

    但是main函数,如果类比一般函数,应该是这样的。不过主函数会不会有些不同,lz知道了可以指导我一下。

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
6 [报告]
发表于 2014-05-06 21:23 |只看该作者
回复 4# folklore
请问这个图来自哪儿啊?《编译原理》龙书?

   

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
7 [报告]
发表于 2014-05-06 21:30 |只看该作者
回复 4# folklore
研究main()的被调用过程,_start(),__libc_start_main(),__libc_init_first,各种宏,各种定义,各种级别的constructor和destructor,等等等等
头都大了,一直理不出头绪
只知道当前ebp中保存上层栈帧的ebp地址,ebp+4返回上层栈帧的地址,ebp+8保存argc,ebp+0xc保存argv地址,但这只是个结论而已,自己并没有找到理论验证

   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2014-05-07 08:56 |只看该作者
本帖最后由 folklore 于 2014-05-07 09:00 编辑

回复 7# superwujc


    这不正回答了你的问题了么(即最前面回答的,和其它函数相同)?
你不用管调用过程。

最简单的实现方式方法可以如下:
在ELF文件中(假定可执行文件格式为ELF),
设定了开始地址为 __start
__start的实现如下:
  1. __start:
  2. ... ; ss,cs,ds,es,gs等
  3. ... ; 设置 ebp, esp, 构建c的执行环境
  4. movw opt,[12]%ebp
  5. movw argv,[8]%ebp
  6. movw argc,[4]%ebp
  7. movw %esp,%ebp
  8. call _main
  9. movw %eax,[4]%ebp ;为exit设置参数
  10. movw %esp,%ebp
  11. call _exit
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-05-15 08:47 |只看该作者
看CRT吧 ···················
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP