Chapter 7:Linking
概述:
  在linux上,从c源码到可执行文件主要需要经历translator(compiler、assembler)生成object file,再经由linker连接成executable object file。今天来研究下linking这一步。
ELF(Executable and Locatable File):
Object file分三种:relocatable object file, executable object file, shared object file。
Object file在各种系统上的格式并不一样,在linux上则为elf。Linux上典型的relocatable object file如图:

分成sections和section header table。 主要是.text(存放已编译程序的机器代码) .data(已初始化的global variables) .symtab(symbol table)。
Linker的处理对象就是relocatable object file, 主要工作为两个:1、symbol resolution; 2、relocation。
1、symbol resolution:
symbol分三种:
1、(without static) Global symbols that are defined by module m and can be referenced by other modules;
2、(extern) Global symbols that are referenced by module m but defined by some other other module;
3、(static) Local symbols that are defined and referenced exclusively by module m.
每个object module都有一个symbol table(即elf中.symtab),里面记载了它所定义和引用的symbol。Symbol resolution就是将所有这些object module的引用和定义一一对应起来。
aside:如果出现multiply defined global symbols,也就是所引用的symbol在多处定义,优先选择function和有初始化的全局变量,它们称为strong symbols。如果是未初始化的多处定义,则随机选择,这自然是不好的。我们写程序时应该避免同名的情况。
2、Relocation:
Relocation分为两步,先合并section和symbol definitions并分配run-time address, 再更改那些symbol references的地址
经过一番努力,终于得到了executable object files,可以直接加载到内存中运行了。
Dynamic Linking:
前面说的static linking是在发生在编译时,而dynamic linking则是在程序载入内存后。Shared library(在Linux上一般是.so后缀,而在windows上则是DLL)就是动态加载的。
在编译时所用到的shared library中实际的数据和代码并不会被复制到可执行文件中,复制的是一些relocation and symbol table information。这些信息使得程序可在运行中动态加载所需的数据和代码。
随想:
因为以前没有接触过这种比较底层的知识,所以乍看之下信息量比较大,虽然很有趣,但脑袋也有点晕了。还是应该抓住重点,一些细节可以以后再回顾。
但是经过这番努力,对计算机系统的一些比较底层的原理有了进一步了解。毕竟他是我的好朋友,总是那么兢兢业业、诚恳忠实,对这样的朋友有更深了解总是一件令人开心的事(^_^)也能促进我们今后更好的合作嘛!
Chapter 7:Linking的更多相关文章
- 1.JVM前奏篇(看官网怎么说)
		JVM(Java Virtual Machine) 前奏篇(看官网规范怎么说) 1.The relation of JDK/JRE/JVM 在下图中,我们所接触的,最熟悉,也是经常打交道的 最顶层 J ... 
- Notes for Apue —— chapter 4 Files and Directories(文件和目录)
		4.1 Introduction 4.2 stat, fstat, fstatat, and lstat Functions The lstat function is similar to stat ... 
- JVM Specification 9th Edition (4) Chapter 4. The class File Format
		Chapter 4. The class File Format Table of Contents 4.1. The ClassFile Structure 4.2. Names 4.2.1. Bi ... 
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
		Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ... 
- JVM Specification 9th Edition (2) Chapter 1. Introduction
		Chapter 1. Introduction 翻译太累了,我就这样的看英文吧. 内容列表 1.1. A Bit of History 1.2. The Java Virtual Machine 1. ... 
- Beginning Linux Programming 学习--chapter 17 Programming KDE using QT
		KDE: KDE,K桌面环境(K Desktop Environment)的缩写.一种著名的运行于 Linux.Unix 以及FreeBSD 等操作系统上的自由图形桌面环境,整个系统采用的都是 Tro ... 
- Modern C++ CHAPTER 2(读书笔记)
		CHAPTER 2 Recipe 2-1. Initializing Variables Recipe 2-2. Initializing Objects with Initializer Lists ... 
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
		前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ... 
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
		Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ... 
随机推荐
- Android模拟器检测常用方法
			在Android开发过程中,防作弊一直是老生常谈的问题,而模拟器的检测往往是防作弊中的重要一环,接下来有关于模拟器的检测方法,和大家进行一个简单的分享. 1.传统的检测方法. 传统的检测方法主要是对模 ... 
- 吾八哥学Python(三):了解Python基础语法(上)
			学习一门开发语言首先当然是要熟悉它的语法了,Python的语法还算是比较简单的,这里从基础的开始了解一下. 标识符1.第一个字符必须是字母表中字母或下划线'_'.2.标识符的其他的部分有字母.数字和下 ... 
- PHP 页面静态化/纯静态化/伪静态化
			个人博客迁移至独立博客:https://blog.plcent.com/,欢迎大家访问 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化:是把PHP ... 
- 读Zepto源码之Form模块
			Form 模块处理的是表单提交.表单提交包含两部分,一部分是格式化表单数据,另一部分是触发 submit 事件,提交表单. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ... 
- SpringMVC Spring MyBatis整合配置文件
			1.spring管理SqlSessionFactory.mapper 1)在classpath下创建mybatis/sqlMapConfig.xml <?xml version="1. ... 
- yii2之数据验证
			一.场景 什么情况下需要使用场景呢?当一个模型需要在不同情境中使用时,若不同情境下需要的数据表字段和数据验证规则有所 不同,则需要定义多个场景来区分不同使用情境.例如,用户注册的时候需要填写email ... 
- Android Studio常见问题解决
			1.Error:Execution failed for task ':XXXX:processDebugManifest'. > Manifest merger failed with mul ... 
- 使用fabric解决百度BMR的spark集群各节点的部署问题
			前言 和小伙伴的一起参加的人工智能比赛进入了决赛之后的一段时间里面,一直在构思将数据预处理过程和深度学习这个阶段合并起来.然而在合并这两部分代码的时候,遇到了一些问题,为此还特意写了脚本文件进行处理. ... 
- mybatis 参数为list时,校验list是否为空
			校验objStatusList 是否为空 <if test="objStatusList != null and objStatusList.size() > 0 "& ... 
- js返回到上一个页面刷新与不刷新的写法
			返回上个页面刷新: <script>window.location.href=document.referer</script> 返回上个页面不刷新 <script> ... 
