编译链接浅析

动态链接库全面浅析(一)-----Win32 动态链接库 言前:由于最近复习了下动态链接库,所以决定写一个动态链接库专题。动态链接库网上各种达人已近写过很多了,资料也是一大把一大把的。但是我还是想写一份,因为网上讲的都很分散,讲的不是很系统,而且很多问题没有深究。因此我自己还是写一份吧,因为说明了是浅析。所以说我不可能讲的太深入,但是本 阅读详情

概括、通过对编译和链接的过程分析更加深刻的掌握程序运行的机制。

一、编译

工程中的多个源文件经过预处理、词法分析、语法分析、语义分析、汇编成多个中间目标文件。

二、静态链接

2.1、随着工程量的增加不太可能用一个c文件实现整个工程的功能,需要把工程分成很多个模块,再把模块分解成很多个功能函数,一些具有相近功能的函数被放到一个c文件中。这样一个工程中就可能含有很多个c文件,他们分别进行编译,所以就需要把这些分别编译所生成的中间目标文件进行链接生成可执行文件。较为简单的是静态链接。

2.1、中间目标文件的结构是段式的结构,一般有代码段,数据段,bss段等。中间目标文件的格式和可执行文件的格式几乎一样,只不过是中间目标文件中函数和全局变量的地址无法确定而已。

2.2、每个中间目标文件中的函数和全局变量的地址是无法确定的,所以在对应的代码段中的地址函数地址对应-4,变量地址是0,我们需要在链接时对他们进行重定位。

2.3、重定位函数和全局变量的地址需要两个步骤,第一步是确定整个工程中所有函数和全局变量的虚拟地址,这个步骤是通过计算整个程序中一共含有多少个段,每个段的大小,段对齐设置,以及函数和全局变量在段中的偏移来获得。(代码段和数据段等在特定的操作系统下被装载到的虚拟地址的起始地址是固定的)

2.4、在获得了所有的函数和全局变量的虚拟地址以后,就要对代码段中的地址进行重定位,这是根据重定位表来的,重定位表就是需要重定位的地址和符号(函数和全局变量)的虚拟地址的索引表,这样就可以实现地址的重定位。

三、动态链接

3.1、系统的库函数等模块被应用程序调用的几率非常之大,如果都采用静态链接的话,每个可执行文件都含有相应的库模块的一个副本,无论是存储时还是运行时都极大的浪费空间,而且如果库文件版本升级的话就需要对整个工程进行编译,这就需要采用动态链接的方式来解决此问题。

3.2、动态链接顾名思义就是在装载时再确定模块的地址,这种情况下,动态模块的地址是随机的可变的,因为应用程序可能需要链接多个动态链接库模块,而随机的动态链接的模块地址带来的问题就是动态链接模块在不同的进程中是不一样的(地址不一样),这样的话就无法实现动态链接库代码的共享,为了使动态链接库的代码和数据的访问不随其被装载的地址不同而不同就需要使用地址无关代码技术。

3.3、对于模块内部的函数调用和静态变量的访问是采用相对地址的方式来进行的,所以就不需要地址的重定位。

3.4、而对于模块间的函数调用和全局变量的访问是采用间接访问的方式来进行的,也就是说访问函数和全局变量的间接地址,而这个间接地址是不变的,间接地址里的值就是函数和全局变量的真正地址是可变的。



浅析C/C++编译流程 该系列前面的文章已经讲了C语言和C++的一些重点难点,从本篇博文开始将开始探索C/C++编译体系(不仅仅像其他很多文章一样只讲那四个主要流程,还会更深入讲链接的本质)以及内存模型相关的内容,从编译体系继而将讲解MakeFile以及cmake的内容,而这些内容,将为以后做音视频开发编译第三方库打下坚实的基础~~ 阅读详情

相关推荐

线性代数学习笔记(十)——矩阵运算(二)

本篇笔记讲解矩阵的幂运算和矩阵的转置,其中矩阵进行幂运算的前提是矩阵为方阵,矩阵幂运算的两条性质与数的幂运算规则类似;矩阵转置的定义与行列式转置类似,但要注意由于矩阵的行数和列数不同,所以转置之后行数和列数变换。

li2008kui的专栏 1万+

锂离子电池电压平衡系统设计与实现

电池管理系统(BMS)是新能源储能和电动汽车的核心组件,其核心功能之一是通过电压平衡技术确保电池组各单体电压一致。基于模数转换器(ADC)和微控制器的硬件架构,配合精确的电压采样算法,可以实现±30mV精度的电压监测。这种技术方案不仅能有效防止电池过充/过放,还能显著延长电池寿命。在工程实践中,采用MCP3202 ADC芯片和PIC18F85J10微控制器的组合,通过SPI通信和PWM控制,构建了高效的主动平衡系统。该设计思路可扩展应用于太阳能储能、医疗设备电源等需要精密电压管理的场景,其中硬件滤波和软件滑

weixin_30271335的博客 491

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2564

程序生成之编译、链接、加载浅析

程序生成之编译、链接、加载浅析

琦小虾的代码世界 2462

CM-GAI:基于连续介质力学与最优传输的数据生成新范式

在数据驱动的工程与科学研究中,如何利用有限的物理数据实现可靠预测是核心挑战。传统方法如深度神经网络,在数据稀缺时往往泛化能力不足且缺乏物理一致性。为解决此问题,一种融合物理原理与数据驱动的新范式应运而生。其核心思想是将数据分布的变化类比为连续介质在广义力驱动下的力学变形过程,通过最优传输理论为分布变换提供最优路径的度量。这种方法将物理规律(如质量守恒、运动方程)作为硬约束嵌入模型,确保了生成过程的物理可解释性。物理信息神经网络(PINNs)则被用作高效求解器,处理高维特征空间中的复杂控制方程。在工程实践中,

weixin_30607029的博客 607

康耐视CogPMAlignTool模板匹配详解

康耐视CogPMAlignTool是一款基于边缘特征的模板匹配工具,适用于工业视觉检测。该工具提供PatMax、PatQuick、PatFlex等不同算法,分别对应高精度、快速匹配和柔性表面等应用场景。关键参数包括特征粒度(粗糙/精细)、边缘阈值、弹性范围等,支持旋转缩放匹配和极性忽略功能。工具操作流程包括图像采集、参数设置、模板训练和运行检测,通过调整查找概数、接收阈值等参数可优化识别效果。配套的卡尺工具(CogCaliperTool)通过一维投影和边缘筛选实现精准定位,适用于高精度尺寸测量场景。

2502_92473474的博客 1318

浅析C语言编译与链接

在标准C中,经过翻译环境与运行环境,文件才会被加工变成结果。文件经过翻译环境变成可执行文件,可执行文件经过运行环境得到输出等结果。在此,作者主要讨论源代码翻译的过程,即编译与链接。

ly1611240037的博客 370

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

C:程序的编译(预处理操作)+链接浅析

文章目录程序的编译(预处理操作)+链接编译环境与运行环境程序编译过程预处理编译 (最复杂)汇编链接预定义符号宏与函数对比#&##(不建议使用,认识就行)#undef去掉宏#ifndef ... #endif & #pragma once<>与""的区别 程序的编译(预处理操作)+链接 编译环境与运行环境 int arr[10] = {0}; printf(&quot

CoolSuperman的博客 231

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战

本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。

weixin_42567046的博客 220

TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate

这篇被 ICLR 2026 接收的论文提出了一种名为TurboQuant的全新在线向量量化(Vector Quantization, VQ)算法。该研究的核心目标是解决大语言模型(LLM)在长上下文推理时面临的 KV Cache 显存消耗瓶颈,以及大规模向量数据库在近似最近邻检索中的存储与延迟问题。有别于现有技术,TurboQuant 是一种无需任何校准数据、无需训练的在线算法(Data-oblivious)。

c_cpp_csharp的专栏 118

【C语言程序编译与链接浅析】——从源代码到可执行文件的旅程

return 0;如果未链接包含func()确保目标文件或库文件包含func的定义,并正确参与链接。

HanDengzhuang的博客 974

2篇5章1节:实验流行病学的核心特征和设计原则

本文系统阐释实验流行病学的核心定义、四大核心特征、四大基本原则及主流设计类型,结合骨科、肿瘤科、儿科、精神科、内外妇儿及公共卫生等多学科临床实践案例,具象化解读人为干预、随机分组、平行对照、前瞻性设计的核心内涵与应用价值。同时,规范梳理对照、随机、盲法、重复四大研究基本原则,详细介绍临床试验、现场试验、社区试验三类主流研究设计的适配场景与应用差异。

MD Code 167

GCC编译器工具的使用

文章目录1. 开始C语言的建议:讲解即学习思路:2. gcc生成可执行文件过程预处理 :gcc -E xxx.c编译:gcc -S xxx.i汇编:gcc -c hello.s链接:gcc hello.o -o hello执行可执行文件总结:3. 编辑器vim 使用编程主要事项 1. 开始 C语言的建议: 概念的正确性 动手能力(每天都在成长)(程序员不是培训出来的,像是作家,需要日积月累的) 阅读优秀的程序段(先要动手,再去阅读,有对比才有伤害) 大量练习,面试题(扎实自己的基本功) 讲解即学习思路:

某风吾起的博客 2051

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【维生素C语言】第十八章 - C语言程序环境

你是否思考过代码是如何变成 "可执行程序" 的呢?在这一章,我们将简单地探讨一个 "源程序"是如何变成 "可执行程序" 的,作一个大概了解。

有道无术, 术尚可求。有术无道, 止于术。 8682

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

GNU/GCC链接脚本导学(其实你在用,但你也许并没注意到)

1. 哪些人可以不需要学GNU-ld链接脚本?    1)所有事务都交给编译器自动完成的,只需要写代码的    2)只使用商业性编译器    3)只使用avr,并且不需要实现复杂功能的 2. 哪些人可以考虑去学GNU-ld链接脚本?    1)希望比makefile更进一步控制程序的产生    2)希望在自己需要的存储地址上保存自己指定的数据    3)希望实现程序在存储空间中的模块化或特殊结构的

denniswuu的专栏 1856

c++从入门到精通——extern C小结

c++从入门到精通——extern C小结 extern "C"的主要作用就是为了实现c++代码能够调用其他c语言代码。加上extern "C"后,这部分代码编译器按c语言的方式进行编译和链接,而不是按c++的方式。 test.h #pragma once #ifdef __cplusplus //两个_下划线 extern "C" { #endif // !__cplusplus #include <stdio.h> void show(); #ifdef __cpl

mirana的专栏 163

GCC链接器静态库链接顺序浅析

1. 编译链接介绍 一份C代码要编译成为可执行文件,需要经历以下步骤:预编译,编译,汇编,链接[1],如图1。 图1 编译和链接过程 首先,在预编译阶段,源代码文件被预编译器cpp预编译成一个.i文件。预编译主要处理源代码文件中的以”#”开始的预编译指令。比如:”#include”、”#define”等。经过预编译后的.i文件不包含任何宏定义。 编译阶段就是把预处理完的文件...

piaomiaoxi2的专栏 3378

【C语言】浅析编译原理

致读者: 提到“编译原理”,大部分人的首要反应就是苦恼。确实,编译原理这一部分的内容在计算机学习中是比较难以理解的一部分。首次接触编译原理,我也感觉很复杂,难以理解。但是当看过几次之后,对于一些简单知识点的理解就有点眉目了。在这里就将有点眉目的知识写一下。 编译原理: 要了解编译原理,首先,我们一起来来看看一个程序具体的编译过程吧。 综上可见: ● 组成一个程序的每个源文件通过...

码农印象 1万+

浅析链接

引言 我们都知道一个程序从我们的一个文本文件转化成一个可执行目标文件要经历预处理,编译,汇编和链接四个过程,理解这其中的过程有不仅利于我们写出一个更加健壮,高效的程序 ,而且能在错误时快速定位,成为一个大牛程序员(向之奋斗) 首先我们要清楚链接这个过程究竟干了些什么,我们知道到链接这一步时链接器拿到的是一组可重定向的目标文件,注意是一组,因为我们的程序不仅仅是一个文件,大多数情况下包含多个文件,而...

李兆龙的博客 493

gcc 编译工具(上)--- 编译过程和原理浅析

gcc 编译工具(上)— 编译过程和原理浅析1. 什么是gcc gcc(GNU C Compiler)编译器的作者是Richard Stallman,也是GNU项目的奠基者。 gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器,现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。 gcc支持多种硬件平台,甚至对Don Knuth

men_wen的博客 3016

浅析Linux下gcc编译过程

目录1. gcc简介及基本用法2. gcc编译过程3. 静态链接和动态链接4. 静态库和动态库4.1 静态库的制作和使用4.2 动态库的制作和使用 1. gcc简介及基本用法   GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了...

weixin_42647166的博客 1060

C语言程序编译阶段浅析

编译一个C程序主要经历4个阶段:预处理、编译、汇编、链接,本文将分别对这四个阶段进行解读。

uxlike的博客 1839

浅析C++外部链接和内部链接

在构建多源文件的程序时,将会分离编译每个源文件 ( 作为编译单 元,可以并行编译,节约时间 ) ,得到多个独立的可重定位目标文件 (*.o) 。这些可重定位目标文件最终会被链接器链接成单个可执行文件 目标文件。命令:g++ -c 链接器使得分离编译成为可能。这样,开发者不用将一个大型程序组 织为一个巨大的单个物理模块 ( 例如,将所有代码都放到 main() 所在 的源文件 ) ,而是可以把它分解为若干个更小、更好管理的物理模 块,这样就可以独立地修改和编译这些物理模块。

lichengyang的博客 914

GCC编译流程浅析

GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套服务,开发者只需要关系代码逻辑与功能实现即可,但是,在享受便利的同时,必然也牺牲了一些灵活性。 gcc是什么 国际惯例,先得介绍gcc是什么,gcc的原名为GNU C Compiler,...

did59261的博客 182
上一篇: OpenGL二维图形
下一篇: TCP/IP概述
codesnail
博客等级 码龄18年 113粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值