链接,转载与库:GUIDELINE

第一章

1.2 万变不离其宗

——》各种平台软硬件差异大,但基本概念和原理是一样

SO,只需掌握一种平台上的技术,就可以举一反三。

我们要掌握的是
X86平台下 系统软件
背后的机理。

——》介绍硬件结构框架

1.3 站得高,望得远

——》系统软件的概念

——》系统软件的结构——层

1.4 操作系统主要做什么:提供抽象接口+管理硬件资源

——》硬件资源(1.CPU;2.Memory&Disk;3.I/O设备)是有限的,如何发挥硬件的全部能力

——》(1.4.1)如何发挥CPU的能力

——》(1.4.2)。。。。I/O设备。。。

——》(1.5)。。。。memory。。。

*********************************NEXT CHAPTER************************************

第二章:编译与链接:“分”析被IDE合并的步骤

2.1 被隐藏了的过程

——》如何用GCC将helloworld的source code形成可执行文件的四个步骤分开

2.2 “编译”器做了什么:四个步骤中的第二步compilation

——》词法分析 | 语法分析 | 语义分析 | 中间语言生成 | 目标代码生成与优化

2.3 “链接”器年龄比编译器长

——》链接器完成2个任务:重定位 | 多个模块间的访问

2.4 模块拼接——静态链接

——》概念:如何将分隔开的各个模块合成  一个 正常工作的整体

——》将两个source code静态链接的基本流程:

Address & Storage Allocation | Symbol Resolution | Relocation

*********************************NEXT CHAPTER************************************

第三章:目标文件里有什么

——》单个source code编译后的文件是“目标文件”。看source code是如何存储在目标文件中的

3.1 目标文件的格式:了解有PE和ELF两种主要格式

3.2 目标文件是什么样的

——》以source code中的“指令”和“数据”分段存放

3.3 挖掘SimpleSection.o

——》学习如何查看ELF文件中的各个段

——》各section解释

3.4 ELF文件结构描述:对ELF至关重要的几个section

——》文件头 | 段表 | 重定位表 | 字符串表

3.5 链接的接口——ELF中的符号表

3.6 调试信息:也可能保存在ELF文件中

*********************************NEXT CHAPTER************************************

第四章:静态链接(按链接各个步骤的先后顺序)

4.1 空间与地址分配

——》如何将两个ELF文件中的各个段合并到一个输出文件中

4.2 符号解析与重定位

——》(4.2.1)重定位概念:单独编译时先将全局符号地址置为某特殊地址,当链接器完成4.1后,就由链接器确定所有符号的虚拟地址

——》(4.2.2)重定位表:每个要重定位的ELF段都有一个重定位表

一个source file中要重定位的地方就是引用外部符号的地方

——》符号解析(?)

4.3 COMMON块

——针对弱符号在多个file中定义的处理

4.4 C++相关问题

——》(4.4.1)消除重复代码(如template等)

——》(4.4.2)C++全局构造和析构

4.5 静态库链接

——》程序如何能够使用操作系统提供的API?

4.6 链接过程控制

——》大多数情况下,使用的是链接器的默认规则,这没问题;

但有一些有特殊要求的程序。

——》如何指定链接脚本(4.6.1)

——》小程序:不使用任何库 | 指定nomain为程序的入口 | 控制链接过程生成特殊段

4.7 BFD库:概念

*********************************NEXT CHAPTER************************************

第六章:可执行文件的装载与进程

——》ELF文件(为什么不说可执行文件?)在Linux下的装载过程

6.1 进程虚拟的地址空间

——》一个进程的虚拟进程空间分为几段:operating system | user process

6.2 装载的方式

——》静态装入

动态装入:覆盖装入

页映射

6.3 从操作系统的角度看可执行文件 的装载

——》详细阐述:一个可执行文件如何被装载 + 如何在进程中执行

——》(6.3.1)进程的建立

——》(6.3.2)页错误

6.4 进程虚拟存储空间分布

——》(6.4.1)ELF文件的链接视图和执行视图:从section到segment

从section到segment转变的原因在于:装载时,操作系统并不关心各section的内容,只关心section的读写权限。SO,将相同权限的section归纳为segment——(最终目的),减少按页映射(装载?)的内存浪费。

——》(6.4.2)VMA映射可执行文件的各个segment

VMA映射进程的stack和heap

(6.4.3略)

——》(6.4.4)段地址对齐:可执行文件如何在 基于页映射机制 的装载中节省空间

——》(6.4.5)进程栈初始化:操作系统在 进程启动前 将系统环境变量和进程的运行参数提前保存到栈中。

6.5 Linux系统如何装载指定ELF文件 + 执行它?(实例)

*********************************NEXT CHAPTER************************************

第七章:动态链接

7.1 为什么要动态链接:节省空间(memory,disk)| 模块更新

——》动态链接基本思想:不对各目标文件进行链接(静态链接),而是等到程序要运行时才进行链接

——》动态链接基本实现

7.2 简单的动态链接例子

7.3 地址无关代码

——》(7.3.1)一个困扰

——》(7.3.2)装载时再重定位:使共享对象能在任意地址装载

——》(7.3.3)地址无关代码:装载时重定位的缺点 | 改进装载时重定位

——》(7.3.4)关于地址无关性问题的另一个问题

——》(7.3.5)以上是共享对象中代码部分“地址无关”,这里是数据段“地址无关”

7.4 延迟绑定PLT:优化动态链接性能的方法

——》需要理解7.3动态链接进行的复杂操作,才能理解针对额外操作的优化方法

7.5 动态链接的相关结构

——》以上是动态链接基本原理,这里是动态链接具体实现基础

7.6 动态链接的实际链接步骤(先后顺序)

——》动态链接器bootstrap | 装载共享对象 | 重定位和初始化

——》(7.6.4)Linux动态链接器的实现

7.7 显示运行时链接:通过API由程序自己控制何时加载/卸载

*********************************NEXT CHAPTER************************************

第十章:内存

10.1 程序的内存布局(和6.1的“进程的虚拟空间”有什么不同,是不是6.1是静态链接下,10.1是动态链接下?)

——》加上动态链接之后进程的地址空间是如何分布的。

10.2 栈与调用惯例

——》(10.2.1)栈的概念

——》(10.2.2)调用惯例:函数如何调用的约定(函数参数的入栈顺序)

——》(10.2.3)函数返回值如何传递:返回值 | 返回结构体

10.3 堆与内存管理

——》Linux 进程 堆管理

——》Windows 进程 堆管理

——》以上是关于“堆在进程的地址空间中是如何分布的”;

另一个问题是“如何按用户需要从堆中分配除一块内存”,这是“堆分配算法”

*********************************NEXT CHAPTER************************************

第十一章:运行库

11.1 入口函数和程序初始化(与4.6最后的小程序有关系吗?)

——》入口函数的概念

——》glibc和MSVC的入口函数实现概述(MSVC的入口函数更清晰)

——》(11.1.3)运行库与I/O的概念

——》(11.1.4)MSVC CRT 入口函数初始化:系统堆初始化 | I/O初始化

11.2 C/C++运行库

——》(11.2.1)C语言 运行库:Runtime Library概念

——》(11.2.2)C语言 标准库:

——》(11.2.3)glibc和MSVC都是C运行库的超集(详解)

11.3(没看):运行库与多线程

11.4 C++全局构造和析构(glibc和MSVC是如何完成这个任务,详解)

——》与4.4有关系吗?

11.5 fread实现

——》fread是C标准库一个重要的I/O函数,SO,是平台无关的

而fread最终在Windows平台上是通过Win提供的API ReadFile()实现的,SO,要打通从fread到ReadFile之间的通路

——》glibc的fread实现过于复杂,SO,这里分析MSVC的实现

——》缓冲的概念

——》(11.5.2~1.5.5)具体细节不重要,但 基本思想 | 分析的工具 重要

*********************************NEXT CHAPTER************************************

第十二章:系统调用和API

12.1 什么是系统调用

——》系统调用是“应用程序”从“操作系统”获得的帮助。

——》(12.1.2)Linux系统调用

——》(12.1.3)系统调用的弊端

12.2 系统调用的原理

——》特权级与中断概念

——》基于int的Linux的经典系统调用实现:

当“应用程序”调用系统调用时,“程序”是如何一步步进入操作系统“内核”调用相应函数的(详解):

触发中断 | 切换堆栈 | 中断处理程序

——》(12.2.3)Linux的新型系统调用机制

原因:基于int指令的系统调用在处理器上性能不佳

新机制的关键在于:使用专门针对系统调用的
指令:sysenter,sysexit

12.3 Windows API

——》(12.3.1)Windows API概览

——》(12.3.2)为什么系统调用不用,还要在CRT和系统调用之间加一层API?

——》(12.3.3)API与子系统的概念

链接,转载与库:GUIDELINE

时间: 2024-11-08 20:51:16

链接,转载与库:GUIDELINE的相关文章

再探Linux动态链接 -- 关于动态库的基础知识

  在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台相关目标文件这一层次)和链接(Linking,指目标文件到最终形成可执行文件这一层次),这个总的过程可称为编译时:就动态链接而言,还存在一个运行时,即程序在被操作系统加载的过程中,系统将该程序需要的动态库加载至内存到程序开始运行的这一段过程.明确这两个过程在一般linux开发中的地位,以及了解每个"

AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接加载库

基于模板元编程技术的跨平台C++动态链接加载库.通过模板技术,使用者仅需通过简单的宏,即可使编译器在编译期自动生成加载动态链接库导出符号的代码,无任何额外的运行时开销. ASL_LIBRARY_BEGIN(TestLib) ASL_SYMBOL(Proc_test1, test1, false) ASL_SYMBOL(Proc_test2, test2, true) ASL_LIBRARY_END() TestLib theLib; try { theLib.Load("./1.so"

mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)

原文地址:mingw qt作者:孙1东 不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -no-script -no-scripttools -nomake tools -nomake examples -nomake demos -nomake docs -

VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

Background MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Library: 开关 对应的库 版本 /MD MSVCRT.LIB 多线程DLL的Release版本 /MDd MSVCRTD.LIB 多线程DLL的Debug版本 /MT LIBCMT.LIB 多线程静态链接的Release版本 /MTd LIBCMTD.LIB 多线程静态链接的Debug版本 /clr MSVCMRT.LIB 托管代码和非托管代码混合 /clr:pure MSVCURT.LIB

g++/gcc 链接头文件 库 PATH

转自http://blog.csdn.net/kankan231/article/details/24243871 在Linux下编译链接或运行c/c++程序时可能会遇到找不到头文件,找不到库文件的错误,简单总结一下这些错误的解决方法 1,找不到头文件 解决方法一:在编译时使用 -I 来指定头文件的路径,例如把头文件放在 /home/user/include/ 目录下,则在编译时加上 -I /home/user/include/ ,如有多个目录,可多次使用-I来指定 解决方法二:将头文件的路径加

[转载]加密算法库Crypto——nodejs中间件系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 创业者,程序员(Java,R,Jav

常用资源与相关链接 转载网友的

--------------------------------http://blog.csdn.net/celerychen2009/article/details/20773327 1. 对于从事codec研发,尤其是语音和音频codec研发的人,都知道的ITU-3GP组织.这里汇集了所有与ITU-3GP codec相关的资源,主要包括标准文档, 当然还有各个标准的参考代码. 1.1 http://www.itu.int/rec/T-REC-G/en ITU-G系列的资源,例如G722.2的

沫沫金【实践可用】--web工程ORM数据库链接(JDBC)链接集群库||普通库,两种标准

普通链接配置,应用到集群会启动失败,请修改 集群数据库链接 jdbc.url=jdbc:oracle:thin:@//127.0.0.1:1521/momojin 普通数据库链接 jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521/momojin 区别就在于:"//",如上所示 标红的地方.请务必清楚

VS2010编译链接openssl静态库

最近工作需要使用一些加密算法.之前尝试过cryptopp以及polarssl,听说openssl中的加密模块特别全,并且特别好用.于是想尝试一下. 一.环境配置 下载openssl,我这里使用的是openssl-1.0.1s.解压后查看自带的win32说明文件.我这里解压到d盘 按照安装说明下载activeperl. 二.编译静态库 执行命令: cd D:\openssl-1.0.1s D: perl Configure VC-WIN32 no-asm --prefix=D:\openssl-1