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.基本语法 ...
随机推荐
- Automated Memory Analysis
catalogue . 静态分析.动态分析.内存镜像分析对比 . Memory Analysis Approach . volatility: An advanced memory forensics ...
- 数据结构作业——buzhidao(队列)
buzhidao Description 有一个长度为 n 的序列,第 i 个数的大小为 a[i].现在从第 1 个数开始从左往右进行以下操作:1. 如果当前数是剩下的数中最大的,则输出并删去这个数. ...
- HDU3394:Railway
传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双,如果其中的边数等于点数,那么这个 ...
- ROC & AUC笔记
易懂:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ 分析全面但难懂:http://mlwiki.org/index.php/ROC_ ...
- 使用django开发博客过程记录1——数据库设计
1.数据库设计 2.插入测试数据 3.配置相关问题 1.数据库设计 数据库有简单的三张表:Article.Category.Tag以下是代码 # -*- coding:utf-8 -*- from _ ...
- Java直接内存与堆内存
NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer. DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通 ...
- jquery插件扩展的学习
jquery插件的学习可以点击这里 举个例子 //首先先来一个插件 (function($){ $.fn.extent({ bigfont:function(){ return this.css('f ...
- GetViewUrl
<f:TemplateField HeaderText="名称" ColumnID="Name" ExpandUnusedSpace="true ...
- iOS8新特性(1)-UIPopoverPresentationController使用
从iOS 8开始,苹果提出新的 UIPopoverPresentationController代替UIPopoverController: 新的UIPopoverPresentationControl ...
- java的锁机制
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...