C++开始前篇,深入编译链接(3)
一,COMMON块
什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小。Fortran把这种空间叫做COMMON块,当不同的目标文件需要的COMMON块空间大小不一致时,以最大的一块为准。
关与强弱符号的定义我们已经学习过,简单来说,编译器将未初始化的全局变量的定义作为弱符号处理,已初始化的作为强符号处理。
多个符号定义类型不一致的几种情况:
1,两个或两个以上强符号类型不一致;
2,有一个强符号,其他的都是弱符号,出现类型不一致;
3,两个或两个以上弱符号类型不一致
第一种情况链接器会直接报错,
第二种,直接使用强符号,
第三种哪个类型占用的空间大就使用哪个,
我们在前节学习过,关于符号所对应的符号表,当时留的一个问题就是为什么global_uninit不跟static_uninit一样都放在.bss段,而是放在了COMMON块,现在是时候解决了。
看下表:

当编译器将一个编译单元编译成目标文件时,如果该编译单元包含了弱符号,那么该符号最终所占空间的大小此时是未知的,因为有可能其他的编译单元中该符号所占的符号所占的空间比本编译单元该符号所占的空间要大。所以编译器无法在.bss上给该符号分配空间(即无法保存该符号的信息)。但是链接器可以在链接时读取所有目标文件就可以确定弱符号的大小了,所以它可以在最终输出的文件BSS段为其分配空间。
过程即是 : 未初始化的全局变量-----》COMMON块------》.bss
编译 链接
这是链接之后的文件信息:

看最上一行与最下一行,global_uninit和static_uninit终于在一起了!
二,静态库链接
我们知道不管是在C语言还是在C++中,有很多库文件,比如很简单的输出Hello world程序:
#include<stdio.h>
int main()
{
printf("Hello world!\n");
return ;
}
stadio就是C中的一个标准库,除此之外还有stdlib库,string库等等。。。
在Linux平台下,我们知道,链接器在链接静态库的时候都是以目标文件为单位的。因此,各个功能都是以目标文件来实现的,printf()就在stdio库中的printf.o文件中并且只有这一个函数,strlen()就在string库中的strlen.o文件中并且只有这一个函数。为什么一个目标文件只有一个函数呢,由于运行库有成百上千个函数,数量非常庞大,每个函数独立地放在一个目标文件中可以尽量减少空间的浪费,没有用的就不用添加了。
-------------------------------------------------------------------------------------------------------------------------------------
到这静态链接就差不多就结束了,但是还是得细细细细的揣摩,下节,动态链接继续!
C++开始前篇,深入编译链接(3)的更多相关文章
- C++开始前篇,深入编译链接
C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此, ...
- linux 编译,链接和加载
1. 序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
- 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施
原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...
- webpack2 前篇
webpack2 前篇 #webpack 前两天用了一天半时间琢磨了下webpack2,想起去年这时候,面对webpack1那样恶心的文档,前前后后搞了好几次才摸索清楚,那真是吐了. 划重点 其实we ...
- G++编译链接的那些事
语言 CPP 前言 虽然 VSCodeC++ 编辑器非常受大家的欢迎,无论是大佬还是小白都说对其爱不释手... 我...用了一段时间后发现实在是麻烦,配置往往花费我大量时间.可以说真的是吃力不 ...
- 【原创】Linux下编译链接中常见问题总结
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)
原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...
- 【C编程基础】C编译链接命令gccc
1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc 2.基本语法 ...
随机推荐
- ElasticSearch中bulkProcesser使用
初次接触es,可能对增删改查很熟悉,以为能为得心应手,本次应用场景为 数据库变更一条记录,会触发更新es中的数据,每秒并发大概30条左右,测试环境一切工作正常(数据量较少),上线后发现日志中很多类似于 ...
- Android 千牛数据库分析
标签(空格分隔): 千牛,逆向 问题:Android 千牛登陆后产生保存用户数据的db无法直接用sqlite3打开,需要解密. 反编译Apk后jd-gui查看源码.熟悉的sqlcrypto模块加密,阿 ...
- Python检测服务端口存活状态并报警
最近发现公司的测试环境中有个Socket服务的端口总是莫名其妙Down掉,但是服务却正常运行着,看样子是僵死了... 虽然是测试环境,但是也不能这样放着不管,于是连夜写了一个简单的监控脚本.因为服务器 ...
- vue自定义指令
Vue自定义指令: Vue.directive('myDr', function (el, binding) { el.onclick =function(){ binding.value(); } ...
- 基于fastweixin的微信开发环境搭建(一)
由于公司业务需要,开发微信版本,才开始接触微信公众平台.在github折腾了几天,试过好几个微信sdk,最终选择fastweixin.个人觉得这个框架还是值得使用的,使用也简单.那么问题来了,很多人想 ...
- 利用BitMap进行大数据排序去重
1.问题 问题提出: M(如10亿)个int整数,只有其中N个数重复出现过,读取到内存中并将重复的整数删除. 2.解决方案 问题分析: 我们肯定会先想到在计算机内存中开辟M个int整型数据数组,来on ...
- vim 编辑器的光标操作
vim中最简单的移动光标的方式是使用使用方向键操作,但这种方式的效率底下,更高效的方式是使用快捷键,常用的快捷键如下表所示. 快捷键 功 ...
- Android——SharedPreferences
SharedPreferences是一种轻型的Android数据存储方式,用来保存应用的一些常用配置. 实现SharedPreferences存储的步骤如下: 1.根据Context获取SharedP ...
- Eclipse 各版本版本号代号对应一览表
版本号 代号 日期 Eclipse 3.1 IO [木卫一,伊奥] 2005 Eclipse 3.2 Callisto [木卫四,卡里斯托] 2006 Eclipse 3.3 Eruopa ...
- cstring to char *例子
Cstring m_strDescPath = ""; //类的成员变量 //"打开文件"对话框,选择文件,返回其路径 m_strDescPath = Boot ...