概述: 

  在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. 1.JVM前奏篇(看官网怎么说)

    JVM(Java Virtual Machine) 前奏篇(看官网规范怎么说) 1.The relation of JDK/JRE/JVM 在下图中,我们所接触的,最熟悉,也是经常打交道的 最顶层 J ...

  2. 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 ...

  3. 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 ...

  4. 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. ...

  5. JVM Specification 9th Edition (2) Chapter 1. Introduction

    Chapter 1. Introduction 翻译太累了,我就这样的看英文吧. 内容列表 1.1. A Bit of History 1.2. The Java Virtual Machine 1. ...

  6. Beginning Linux Programming 学习--chapter 17 Programming KDE using QT

    KDE: KDE,K桌面环境(K Desktop Environment)的缩写.一种著名的运行于 Linux.Unix 以及FreeBSD 等操作系统上的自由图形桌面环境,整个系统采用的都是 Tro ...

  7. Modern C++ CHAPTER 2(读书笔记)

    CHAPTER 2 Recipe 2-1. Initializing Variables Recipe 2-2. Initializing Objects with Initializer Lists ...

  8. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper

    前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...

  9. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

    Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...

随机推荐

  1. Installation of the JDK-9 on ubuntu(linux上安装jdk-9)

    Description:Java SE 9 is the latest update to the Java Platform(General Availability on 21 September ...

  2. asp.net mvc webapi 实用的接口加密方法

    在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...

  3. 怎么用SQL语句备份和恢复数据库?

    BACKUP DATABASE "mydb" TO DISK ='C:\mybak.db' with init RESTORE DATABASE "mydb" ...

  4. JavaScript HTML Dom改变HTML

    本人为小白,首次写博客  有不正确的地方望多多指点与见谅!! 一,改变HTML的内容 语法: document.getElementById(id).innerHTML=new HTML: 具体用法: ...

  5. word2vec 在 非 自然语言处理 (NLP) 领域的应用

    word2vec 本来就是用来解决自然语言处理问题的,它在 NLP 中的应用是显然的. 比如,你可以直接用它来寻找相关词.发现新词.命名实体识别.信息索引.情感分析等:你也可以将词向量作为其他模型的输 ...

  6. Linux入门(3)——Ubuntu16.04下安装VMware

    下载linux版本 http://www.vmware.com/cn/products/workstation/workstation-evaluation.html 激活秘钥:5A02H-AU243 ...

  7. 在MVC中使用rdlc格式的报表

    前言 近期,在公司做的项目中做到报表模块需要使用rdlc格式的报表,这个报表需要使用WebForm来加载,但是现在用ASP.NET做项目基本上都是MVC.由于以前没有使用过,因此记录下来,供以后查阅. ...

  8. web service实例

    一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...

  9. JS框架设计读书笔记之-函数

    这次写一些函数 1.模拟Object.keys方法 Object.keys = Object.keys || function(obj){ var a = []; // a[0],a[1]...分别赋 ...

  10. transform 各种影响

    1.提升元素的z-index层级,下面这个例子会让前面的图片显示在上面,一般来说应该是后面的覆盖前面图片的 <img src="mm1" style="-ms-tr ...