c/c++从源文件变为可执行文件过程中“地址”的变化过程是怎样的? |
您所在的位置:网站首页 › c运行文件反编译 › c/c++从源文件变为可执行文件过程中“地址”的变化过程是怎样的? |
一、变量不是总是有地址,可能在编译阶段被优化掉。是否分配受编译优化选项影响。 以下面这段代码来说明下。 源代码不开启编译优化选项时,sum函数的反汇编开启O1优化选项时,sum的反汇编。不开启编译优化选项时,sum函数中的c变量的地址是-04x(%rbp)。而开启了O1优化选项后,c变量被优化掉了。所以变量不一定分配地址。 二 接下来用不开启编译优化选项的反汇编说明下局部变量的地址变化情况。 1、预编译:仅仅是处理源代码中以"#"开头的各种预编译指令,对变量地址无任何处理。 2、编译:将预编译生成的文件中的c代码转换成汇编代码。上面sum的反汇编就是在这个阶段生成的。上述汇编代码中对变量的访问都是基于rbp值的偏移,即相对地址。 3、汇编:将汇编代码翻译成机器码。仅仅做翻译,不做地址处理。 4、链接:这个阶段与地址相关的是地址重定向。对局部变量的地址不做处理。这个阶段的输出是二进制文件。 5、运行:运行时会分配栈空间,栈顶的地址保存在rsp寄存器中(逻辑地址)。运行到函数sum时,就是从sum的汇编代码头开始执行。图中的第2点,会把rsp赋值给rbp,这时rbp的值就是有效逻辑地址了。后续对变量的访问都是基于rbp中的值偏移后访问。基于rbp值偏移后的地址仍是逻辑地址。CPU执行指令时在地址翻译阶段把逻辑地址翻译成物理地址,再基于物理地址进行读写操作。地址翻译由CPU中的硬件MMU自动完成,对程序员是透明的。 先写到这,全局变量的地址后续再补上。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |