C++基础语法梳理:链接装载库

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础语法梳理:链接装载库相关的知识,希望对你有一定的参考价值。

内存、栈、堆

一般应用程序内存空间有如下区域:

栈:由操作系统自动分配释放,存放函数的参数值、局部变量等的值,用于维护函数调用的上下文

堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收,用来容纳应用程序动态分配的内存区域

可执行文件映像:存储着可执行文件在内存中的映像,由装载器装载是将可执行文件的内存读取或映射到这里

保留区:保留区并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称,如通常 C 语言讲无效指针赋值为 0(NULL),因此 0 地址正常情况下不可能有效的访问数据

栈保存了一个函数调用所需要的维护信息,常被称为堆栈帧(Stack Frame)或活动记录(Activate Record),一般包含以下几方面:

函数的返回地址和参数

临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量

保存上下文:包括函数调用前后需要保持不变的寄存器

堆分配算法:

空闲链表(Free List)

位图(Bitmap)

对象池

“段错误(segment fault)” 或 “非法操作,该内存地址不能 read/write”

典型的非法指针解引用造成的错误。当指针指向一个不允许读写的内存地址,而程序却试图利用指针来读或写该地址时,会出现这个错误。

普遍原因:

将指针初始化为 NULL,之后没有给它一个合理的值就开始使用指针

没用初始化栈中的指针,指针的值一般会是随机数,之后就直接开始使用指针

编译链接

各平台文件格式

编译链接过程

(1)预编译(预编译器处理如 #include、#define 等预编译指令,生成 .i 或 .ii 文件)

(2)编译(编译器进行词法分析、语法分析、语义分析、中间代码生成、目标代码生成、优化,生成 .s 文件)

(3)汇编(汇编器把汇编码翻译成机器码,生成 .o 文件)

(4)链接(连接器进行地址和空间分配、符号决议、重定位,生成 .out 文件)

现在版本 GCC 把预编译和编译合成一步,预编译编译程序 cc1、汇编器 as、连接器 ld

MSVC 编译环境,编译器 cl、连接器 link、可执行文件查看器 dumpbin

目标文件

编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。

可执行文件(Windows 的 .exe 和 Linux 的 ELF)、动态链接库(Windows 的 .dll 和 Linux 的 .so)、静态链接库(Windows 的 .lib 和 Linux 的 .a)都是按照可执行文件格式存储(Windows 按照 PE-COFF,Linux 按照 ELF)

目标文件格式

Windows 的 PE(Portable Executable),或称为 PE-COFF,.obj 格式

Linux 的 ELF(Executable Linkable Format),.o 格式

Intel/Microsoft 的 OMF(Object Module Format)

Unix 的 a.out 格式

MS-DOS 的 .COM 格式

PE 和 ELF 都是 COFF(Common File Format)的变种

目标文件存储结构

链接的接口————符号

在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量的地址的引用。我们将函数和变量统称为符号(Symbol),函数名或变量名就是符号名(Symbol Name)。

如下符号表(Symbol Table):

今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:829164294点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

 

 

以上是关于C++基础语法梳理:链接装载库的主要内容,如果未能解决你的问题,请参考以下文章

C++基础语法梳理:Windows 的动态链接库

C++基础语法梳理:智能指针和强制类型转换运算符

C++基础语法梳理:算法丨查找算法(全)

C++基础语法梳理:数据结构丨递归

C++基础语法梳理:算法丨十大排序算法

C++基础语法梳理:数据结构丨哈希表