码迷,mamicode.com
首页 > 其他好文 > 详细

使用gcc

时间:2018-09-22 19:50:19      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:栈帧   ima   文件   调用   symbol   alt   入口   32位   程序   

要想研究使用 gcc, gcc-multilib 这个包是一定要安装的, 它允许通过 -m32 和 -m64 选项来选择生成 32 位或者 64 的 ELF 文件.

我们知道程序的默认起点是 _start, 该函数做了一些未知/初始化的工作, 然后调用 main 函数, 如果 main 函数返回, 则由 _start 函数销毁进程.

我们可以使用 -e<symbol> 来重新设置该入口点.

 技术分享图片

观察上面的程序, 无论在32位下还是64位下均出现错误, 是什么原因?

没错, 就是因为没有销毁进程, 导致 ret(q) 指令(x86-64)继续执行, 该指令从调用者栈帧中取指令地址, 导致 main 函数返回到未知的内存地址取指令, 可能这个内存地址无法访问, 当然, 即使成功取址, 也极可能是无效的指令, 导致崩溃. 这件事告诉我们: 有些函数是不能返回的(实际上是计算机指令必须严格有序地按人类设计执行, 差之毫厘, 谬之千里).

技术分享图片

 

使用gcc

标签:栈帧   ima   文件   调用   symbol   alt   入口   32位   程序   

原文地址:https://www.cnblogs.com/develon/p/9690641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!