`

c语言栈帧

c 
阅读更多

C语言栈帧:向下生长,高地址-->地地址(减法),帧指针ebp,每次被调用,保存原先的帧指针,ebp指向被调用栈帧的高地址;栈指针esp,指向栈顶,每次入栈,esp减,出栈,esp加

 

 

main()也是一个函数。

这是因为在编译连接时它将会作为crt0.s汇编程序的函数被调用。crt0.s是一个桩(stub)程序,名称中的“crt”是“C run-time”的缩写。该程序的目标文件将被链接在每个用户执行程序的开始部分,主要用于设置一些初始化全局变量。通常使用gcc编译链接生成文件时,gcc会自动把该文件的代码作为第一个模块链接在可执行程序中。在编译时使用显示详细信息选项“-v”就可以明显地看出这个链接操作过程。因此在通常的编译过程中,我们无需特别指定stub模块crt0.o。为了使用ELF格式的目标文件以及建立共享库模块文件,现在的编译器已经把crt0扩展成几个模块:crt1.0、crti.o、crtbegin.o、crtend.o和crtn.o。这些模块的链接顺序为crt1.o、crti.o、crtbegin.o(crtbeginS.o)、所有程序模块、crtend.o(crtendS.o)、crtn.o、库模块文件。gcc的配置文件specfile指定了这种链接顺序。其中,crt1.o、crti.o和crtn.o由C库提供,是C程序的“启动”模块;crtbegin.o和crtend.o是C++语言的启动模块,由编译器gcc提供;而crt1.o则与crt0.o的作用类似,主要用于在调用main()之前做一些初始化工作,全局符号_start就定义在这个模块中。crtbegin.o和crtend.o主要用于C++语言,在.ctors和.dtors区中执行全局构造(constructor)和析构(destructor)函数。crtbeginS.o和crtendS.o的作用与前两者类似,但用于创建共享模块中。crti.o用于在.init区中执行初始化函数init()。.init区中包含进程的初始化代码,即当程序开始执行时,系统会在调用main()之前先执行.init中的代码。crtn.o则用于在.fini区中执行进程终止退出处理函数fini()函数,即当程序正常退出时(main()返回之后),系统会安排执行.fini中的代码。

分享到:
评论

相关推荐

    函数栈帧的创建与销毁大致总结

    我们在学习c语言的时期,经常被这些问题困扰,这些问题都将在本资源中得到讲解,其次,这份资源是一份笔记文件,如有不足之处请多包涵,如果想要其他部分的笔记(c语言,c++,数据结构)可以私信我,欢迎大家一起来...

    C语言函数调用栈(三)

    本节通过代码实例分析函数调用过程中栈帧的布局、形成和消亡。示例代码如下:该程序每个函数都嵌入汇编代码,以获取各函数运行时刻EBP和ESP寄存器的值。每个函数都打印出EBP寄存器所指向内存地址处的值,以及位于其...

    C语言程序内存布局

    C语言通过栈来维护函数调用上下文,也就是说C中的函数、函数参数列表、局部变量、函数返回值都保存在栈内存中,在完成函数调用之后栈帧随即销毁,至于具体的压栈顺序和上下文维护工作由谁来完成,则取决于函数的调用...

    美国..现代编译原理C语言描述.高清版

    书中专门为学生提供了一个用C语言编写的实习项目,包括前端和后端设计,学生可以在一学期内创建一个功能完整的编译器。  本书适用于高等院校计算机及相关专业的本科生或研究生,也可供科研人员或工程技术人员参考。...

    C语言函数调用栈(二)

    创建一个栈帧的最重要步骤是主调函数如何向栈中传递函数参数。主调函数必须精确存储这些参数,以便被调函数能够访问到它们。函数通过选择特定的调用约定,来表明其希望以特定方式接收参数。此外,当被调函数完成任务...

    function-call-principle:这是文章关于函数调用原理的文章,通过大量的示意图由浅入深分析了函数完整的生命周期

    最后会提供几个例子来发现C语言函数栈帧的一些有意思的行为。 全文将成为你领略函数与栈的魅力,文章提供了的阅读方式。 目录 本文可以收获什么? 函数间如何转移控制 函数间如何传递数据 栈帧的初始化与销毁 C / C ...

    快速入门汇编语言-非常详细且系统地介绍x86-64汇编语言的文.md

    1. 从C语言到汇编语言的过程介绍 2. x86_64平台的相关背景知识,如寄存器、内存、栈、PC寄存器、条件码等 3. 汇编指令的格式和种类,如操作码、操作数的表示 4. 通过一系列例子详细解释如何阅读和理解汇编代码 5. 重点...

    Python函数生成器原理及使用详解

    # python解释器 python.exe 会用一个叫做PyEval_EvalFrameEx(c语言函数)去执行foo函数,首先会创建一个栈帧(stack frame), """ python在运行前会编译成字节码对象 当foo调用bar函数进,又会创建一个栈帧, 关键是所有的...

    picoC-master.zip

    Picoc是google开源代码项目中看到的一个项目,其初衷貌似是要做一个在小的嵌入设备上的C解释器。它的核心代码只有3500行左右,可读性不错,虽然没有实现完整...expression做表达式解析,variable变量管理分配释放栈帧。

Global site tag (gtag.js) - Google Analytics