C++快速入门 (八) 函数运行原理

本文介绍了C++的函数运行原理,包括目标文件的生成过程,如预处理、编译、汇编和链接,以及内存中的用户空间和数据段的划分。详细讲解了大端法和小端法、长度对齐的概念。接着探讨了函数调用的运行原理,特别是堆栈的作用和分配方式,以及不同函数调用约定(如cdecl、stdcall、fastcall、pascal)的特点。
摘要由CSDN通过智能技术生成

一 目标文件

(1). 编译器都做了什么
从源代码到可执行文件,基本上是顺序通过以下几步完成
  • 预处理 -- 主要处理 以#开头的预编译指令,及删除注释等
  • 编译 -- 将语法翻译成汇编语句
  • 汇编编译 -- 将汇编语句变成机器码,转换后的文件叫 目标文件,一般后缀为 .obj(vc编译器) 或 .o(gcc等其他编译器)
  • 链接 -- 为当前目标文件中 调用其他文件变量或函数 的地方 填入正确地址。然后转换为可执行文件。
其中 汇编编译后生成的 目标文件 是有一定格式的,并且 和 连接后生成的 可执行文件 格式基本是相同的。可以通过 binutils工具的objdump命令查看 目标文件内部结构。如下代码  <   如未特别一律是讨论 win下的 pe 文件结构  >

/*************************************/
// 可以通过 binutils工具的objdump命令查看 目标文件内部结构
// $ cl hello.cpp
// $ objdump -h hello.obj
// $ objdump -h hello.exe
/*************************************/
#include<stdio.h>
int global_userId = 555;
int global_userName;
void Say (int id )
{
     printf("hello~ %d\n",id);
}
int main(int argc, char const *argv[])
{

     int off = 2;
     Say( global_userId + off );
     return 0;
}


查看其目标文件结构为

/*   obj 目标文件结构 */
hello.obj:     file format pe-i386

Sections:
Idx Name          Size             VMA          LMA           File off     Algn
  0 .drectve       0000002f  00000000  00000000  00000104  2**0
                        CONTENTS, READONLY, DEBUGGING, EXCLUDE
  1 .debug$S    0000007c  00000000  00000000  00000133  2**0
                        CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
  2 .data           00000004  00000000  00000000  000001af  2**2
                        CONTENTS, ALLOC, LOAD, DATA
  3 .bss             00000004  00000000  00000000  00000000  2**2
                        ALLOC
  4 .rdata          0000000b  00000000  00000000  000001b3  2**2
                        CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .text            00000042  00000000  00000000  000001be  2**4
                        CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE


/*   exe 可执行文件结构 */
hello.exe:     file format pei-i386

Sections:
Idx Name          Size               VMA       LMA           File off      Algn
  0 .text            00007250  00401000  00401000  00000400  2**2
                        CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .rdata          0000462e  00409000  00409000  00007800  2**2
                        CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .data            00000e00  0040e000  0040e000  0000c000  2**2
                        CONTENTS, ALLOC, LOAD, DATA
  3 .reloc           00001184  00411000  00411000  0000ce00 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值