概述: 

  在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. win10 uwp 自定义控件初始化

    我遇到一个问题,我在 xaml 用了我的自定义控件,但是我给他设置了一个值,但是什么时候我才可以获得这个值? 本文告诉大家,从构造函数.loaded.Initialized 的调用过程. 用最简单的方 ...

  2. 阿凡题UWP的源码公开

    高考结束了!这现在就是一款我不会用的app了...所以我以后很少能去维护它了 所以现在决定公开它的源码吧 代码写的相当烂,是自己中早期的一个作品了 里面还有一些自己没填完的坑以及挖到一半的坑.... ...

  3. 根据选中不同的图元来显示不同的属性面板changePropertyPane.html

    在现实生活中,我们有很多时候需要根据选中不同的东西来获取不同的属性,并且就算是同类型的东西我们有时也希望显示不同的属性,就像每个人都有不同的个性,可能会有相同点,但是不可能完全相同. 根据这个思想,我 ...

  4. 读阮一峰老师 es6 入门笔记 —— 第一章

    鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ,c ...

  5. 面向接口编程实现不改代码实现Redis单机/集群之间的切换

    开发中一般使用Redis单机,线上使用Redis集群,因此需要实现单机和集群之间的灵活切换 pom配置: <!-- Redis客户端 --> <dependency> < ...

  6. USACO奶牛博览会(DP)

    Description 奶牛想证明他们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N头奶牛进行了面试,确定了每头奶牛的智商和情商. 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成 ...

  7. hack查询地址

    悲催的IE! http://browserhacks.com/

  8. web开发|如何选择合适的webui框架

    在市场中很多人分不清框架和库的区别,部分只知道框架模糊的概念.所以在选择webUI框架的时候就会仁者见仁智者见智,会存在各抒己见也是很正常的,这里整体都叫框架吧,在市场中不断的淘汰与创新,主要以Vue ...

  9. x86-64栈帧中的“红色区域” red zone of stack frame on x86-64

    前几天看System V AMD64 ABI标准的时候发现栈帧的顶部后面有一块"red zone",在学cs:app3e/深入理解操作系统的时候并没有遇到这个,总结一下. 引用标准 ...

  10. Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency

    InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象:每次都用同一个对象: In ...