从编译器角度理解C++编译和连接原理

news2024/11/18 3:51:32

C++编译链接整体介绍

在这里插入图片描述

链接主要工作

  1. 1 所有.o文件段的合并,符号表合并后,进行符号解析

    链接时就是在符号表中找对应的符号是否只出现于.text.data段一次,若一次都无,则符号未定义;若出现多次,符号重定义

  2. 符号重定位(重定向),给所有符号分配虚拟地址,前面都是全0

根据如下两段代码分析

其中注释表示符号和存放在进程虚拟地址空间的位置

//main.cpp
// 引用sum.cpp里定义得全局变量及函数
extern int gdata;  // gdata *UND*
int sum(int, int); // _Z3sumii *UND*

int data = 20; // data .data

int main() // main .text
{
    int a = gdata;
    int b = data;
    int ret = sum(a, b);
    return 0;
}

// sum.cpp
int gdata = 20; // gdata .data
int sum(int a, int b) // _Z3sumii .text
{
    return a + b;
}

编译生成目标文件:

jyhlinux@ubuntu:~/share/test$ g++ -c main.cpp

jyhlinux@ubuntu:~/share/test$ g++ -c sum.cpp

查看main.o符号表:

objdump -t main.o

在这里插入图片描述

查看sum.o符号表

在这里插入图片描述

*UND* -undefine,表示引用该符号

分析main.o文件头

在这里插入图片描述

打印目标文件各个段:readelf -S main.o (seg)

在这里插入图片描述

分析main.o的.text段

jyhlinux@ubuntu:~/share/test$ g++ -c main.cpp -g

jyhlinux@ubuntu:~/share/test$ objdump -S main.o

在这里插入图片描述

由上图可知编译过程中,符号是不分配虚拟地址的里面看汇编代码发现变量的值都为全0,说明符号值还没加载进来,这也是.o无法执行的原因之一

符号什么时候分配虚拟地址:链接过程,第一步符号解析完成后

手动链接:ld -e main *.o

查看可执行文件a.out的符号表

在这里插入图片描述

可以看出每个符号都有其对应的虚拟地址以及所在的区域,运行时就可以将其加载到指定段中(如.data .text)

分析可执行文件的elf头

在这里插入图片描述

再看一下a.out的汇编代码

在这里插入图片描述

可以发现main函数内第一条指令地址就是前面的入口地址(entry)

a.out 比 *.o 多了program headers段,有两个load,告知系统,运行时把哪些内容加载到内存中(.text, .data)

在这里插入图片描述

运行程序时的工作大概如下图,数据加载到指定段,将虚拟地址映射到物理地址空间:

在这里插入图片描述

cpu虚拟地址,做一个地址映射

页面异常=》执行地址映射页面异常处理程序,分配物理内存

杂项

进阶阅读

  1. 《CSAPP》第七章
  2. 《程序员的自我修养》第2、3、4、6章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE补充 | apache-common包的使用,快速完成IO操作

目录 一:apache-common包的使用,快速完成IO操作 1. IOUtils类的使用 2. FileUtils类的使用 一:apache-common包的使用,快速完成IO操作 IO技术开发中,代码量很大,而且代码的重复率较高,为此Ap…

【MySQL】数据库约束和聚合函数的使用

目录 上篇在这里喔~ 1.数据库约束 1.NULL约束 2.UNIQUE唯一约束 3.DEFAULT默认值约束 4.PRIMARY KEY主键约束 5.FOREIGN KEY外键约束 2.表的设计 1.设计思路​编辑 2.固定套路​编辑 2.1一对一关系 2.2一对多关系 ​编辑 2.3多对多关系 ​编辑​编辑​编辑 3.插入…

《C++模板》(初阶)零基础讲解

本文主要介绍C的模板,包括函数模板和类模板 文章目录 为什么要有模板1、函数模板1.1 函数模板概念1.1 函数模板格式1.3 函数模板的原理1.4 函数模板的实例化1.5 模板参数的匹配原则 2、类模板2.1 类模板的定义格式2.2 类模板的实例化 为什么要有模板 就拿我们写的交…

从“捐赠openEuler”到“向openEuler捐赠”,openEuler生态走入高速发展期

【中国,上海,2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会指导,中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办,以“万涓汇流,奔涌向前…

ROS使用(10)URDF

Building a visual robot model from scratch 在本教程中,我们将构建一个机器人的视觉模型,它看起来有点像R2D2。 在后面的教程中,您将学习如何 清晰地表达模型,添加一些物理属性,并使用xacro生成更简洁的代码&#x…

Rebex Total Pack文件传输组件,改进的递归断路器

Rebex Total Pack文件传输组件,改进的递归断路器 文件系统:改进的递归断路器。 ZIP:改进了ZIP数据描述符解析器,以更好地处理与Zip64的不一致性。 .NET组件 Rebex文件服务器-适用于.NET的SFTP、SCP和SSH服务器组件。可以轻松创建可供任何SFTP…

AI 时代的学习方式: 和文档对话

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

Spring请求与响应——响应

我们上一篇文章说了请求,SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户也就是给用…

Codeium的使用

官网:CodeiumCodeium offers best in class AI code completion & search — all for free. It supports over 40 languages and integrates with your favorite IDEs, with lightning fast speeds and state-of-the-art suggestion quality.https://codeium.co…

数据结构_第十三关(3):归并排序、计数排序

目录 归并排序 1.基本思想: 2.原理图: 1)分解合并 2)数组比较和归并方法: 3.代码实现(递归方式): 4.归并排序的非递归方式 原理: 情况1: 情况2&…

docker的三种镜像创建

目录 dock的三种镜像创建 基于现有的镜像创建 基于本地模板创建 基于Dockerfile 创建 联合文件系统 镜像加载原理 为什么Docker里的centos的大小才200M? Docker 镜像结构的分层 Dockerfile 操作常用的指令 Dockerfile格式 dockerfile构建apache实例 dock的…

探索【Stable-Diffusion WEBUI】各种插件和追求更高效

文章目录 (零)前言(一)界面与翻译(1.1) 主题风格(kitchen Theme)(1.2) 对照翻译(Bilingual Localization)(1.3) 自行翻译(1.3) 提示词翻译(Prompt Translator&#xff09…

asp.net765数码手机配件租赁系统

员工部分功能 1.员工登录,员工通过自己的账号和密码登录到系统中来,对租赁信息进行管理 2.配件查询,员工可以查询系统内的配件信息 3.客户信息管理,员工可以管理和店内有业务往来的客户信息 4.配件租赁,员工可以操作用…

字节蝉联全球独角兽榜首,ChatGPT企业狂升200多位

江山代有才人出,各领风骚数百年。 4月18日, 胡润研究院发布了《2023全球独角兽榜》,列出了全球成立于2000年之后,价值10亿美元以上的非上市公司。 榜单显示,全球一共有1361家独角兽企业入围榜单,分布在48个…

不要再问为什么在职读研?在中国人民大学与加拿大女王大学金融硕士项目听到了最好的答案

为什么要在职读研呢?平时工作已经很忙很累了,再利用业余时间去学习是为什么呢?有不满足于现状的,有一直为了自己目标努力冲刺的,有为了圆自己名校梦想的,也有单纯喜欢专业喜欢学校的。相信每个读研人都有自…

在时代的浪潮中实在前行,实在智能应邀出席浪潮数字企业2023生态伙伴大会

4月15日,以“新产品 新路径 新生态,共赢2023”为主题的浪潮数字企业生态伙伴大会在济南召开。 浪潮集团执行总裁王兴山、浪潮数字企业总经理魏代森、浪潮数字企业副总经理兼CTO郑伟波、IDC中国副总裁兼首席分析师武连峰等业内专家、实在智能等行业领军企…

三步搞定centos虚拟机的克隆

vm17centos7min版本,三步实现大数据的基础操作 一 在vm中选择克隆选项二 配置IP地址三 三台设备基于秘钥实现免密登录1 三台设备分别执行下面的指令,产生公钥和私钥2 给hadoop124和hadoop123 和hadoop122执行下列指令,将123和124的公钥拷贝给…

【小程序云开发】30分钟搭建个人相册小程序

文章目录 前言准备工作小程序架构创建小程序云开发环境创建数据库搭建个人相册写在最后 前言 图片存储,是所有应用开发里最常见的场景之一。 本文将通过实战“个人相册小程序”开发,教你如何借助小程序 云开发 能力,提升功能开发效率&#x…

【环境篇 1】CC2340环境搭建

文章目录 1 准备安装条件2.安装工具2.1 CCS12.1 安装2.2 下载并安装CC23XX SDK2.3 下载并安装对应开发环境和版本的 Sysconfig2.4 下载对应版本Free-RTOS2.5 下载并安装 TI Clang 3 工程编译3.1 环境修改3.2 导入工程2.4 编译项目 1 准备安装条件 CCS IDE编译工具,…

React 路由react-router-dom详解

React 路由react-router-dom详解 ( 路由嵌套 路由传参 路由权限 路由优化 按需导入 404页面 ) 前面我们先了解一下 路由是什么? 路由分类有哪些?内置API有哪些? 可能有点枯燥,不喜欢看的直接跳过! 1,相…