首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序的编译、链接,装入过程

内存是用于存储数据的硬件。程序执行前需要先放到内存中才能被CPU处理。代码编译到运行流程:编译->链接->装入。 编译:代码会被编译成机器码被操纵系统执行,包含相应指令、操作码、和若干参数等。...链接:由链接程序Linker将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块(可执行文件)。...3.运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。优点是便于修改和更新,便于实现对目标的共享。...有三种装入方式: 1.绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。...即编译、链接后得到的装入模块的指令直接就使用了绝对地址;装入程序按照装入模块中的地址,将程序和数据装入内存;绝对装入只适用于单道程序环境。

1.1K20

“ Hello world ”中的秘密之【C语言程序编译和链接】

但是代码的运行过程却很少有人清楚,接下来我将介绍代码运行的奥秘。 1.1运行过程 实际上,运行过程中包括四个过程:预处理,编译,汇编,链接。...• 或保留所有的#pragma的编译器指令,编译器后续会使用。 注意: 经过预处理后的.i⽂件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到.i⽂件中。...链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。...我们在 test.c ⽂件中每⼀次使⽤ Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地址, 但是由于每个⽂件是单独编译的,在编译器编译 test.c 的时候并不知道 Add...等待最后链接的时候由链接器根据引⽤的符号 Add 在其他模块中查找 Add 函数的地址,然后将 test.c 中所有引⽤到Add 的指令重新修正,让他们的⽬标地址为真正的 Add 函数的地址,对于全局变量

15310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    编译、链接到载入、运行的大致过程----2.链接

    编译完成之后,需要的步骤就是 链接.编译仅仅转换源代码到二进制的机器码,但是并没有把程序运行需要的所有资源整合到一起,所以编译后的"目标文件"是没办法直接运行的;在实际的项目中,通常是由多个源代码文件,...这个整合的过程就是“链接”....以下是用gcc对两个源文件进行编译链接的完整过程示例: [root@www ~]# cat my.c #源文件my.c #include void myfunction...”换成 源文件,那么编译,链接都在这一条命令里面完成了; [root@www ~]# ....链接后的文件有segment的描述,也有section描述,而编译后的文件只有section. 2. 只有type 为“LOAD”的segment 会在程序加载的时候被载入内存 3.

    86830

    编译与链接过程的思考

    前言 最近遇到一个错误,如下 在解决过程中,回顾了很多知识,于是有了这篇文章。 关键词:预处理、编译、汇编、链接、动态链接库、静态链接库、真机调试。...1、静态链接 静态连接就是把静态连接库(.a文件)中的文件链接到可执行文件中; .a文件是多个.o文件的组合; .o文件是对象文件,里面是机器指令; 链接就是多个.o文件打包成可执行文件;...c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation unit), 源文件先是被编译成一个个目标文件, 再由链接器把这些目标文件组合成一个可执行文件或库...,链接的过程,其核心工作是解决模块间各种符号(变量,函数)相互引用的问题,对符号的引用本质是对其在内存中具体地址的引用,因此确定符号地址是编译,链接,加载过程中一项不可缺少的工作,这就是所谓的符号重定位...总结 在写文章过程中,简单复习了下编译原理与汇编语言,深感程序员的技能树太过庞大,随便一个分支就够学习一辈子。

    1.3K90

    程序的编译、链接、装载与运行

    程序的编译、链接、装载与运行 2018-11-23 在Linux操作系统中,一段C程序从被写下到最终被CPU执行,要经过一段漫长而又复杂的过程。下图展示了这个过程 ?...目录 编译 目标文件的格式 链接 装载 运行 1. 编译 编译就是把程序员所写的高级语言代码转化为对应的目标文件的过程。一般来说高级语言的编译要经过预处理、编译和汇编这几个过程。...相反因为没有了动态链接库的依赖,不需要考虑动态链接库的不同的版本,静态链接的文件可以做到链接即可执行,减少了运维和部署上的复杂度,是非常的方便的,在有些新发明的语言(例如golang)中链接过程默认已经开始使用静态链接...ab 在ELF文件中有两个叫做重定位表和符号表的段我们之前没有介绍,它们对于链接过程起着及其重要的作用,接下来我们详细了解一下这两个段 重定位表 可以简单的认为是编译器把所有需要被重定位的数据存放在重定位表中...而a.c中则不一样,因为在a.c中变量shared和函数swap都没有定义在当前的文件中,因此编译后产生的目标文件中不存在它们的地址信息,所以编译器需要把它们放在重定位表中,等到链接时再到其它目标文件中找到对应的符号信息之后对其进行重定位

    1.4K10

    【程序的编译(预处理操作)+链接】

    程序的编译(预处理操作)+链接 1. 程序的翻译环境和执行环境 2. 详解编译+链接 2.1 翻译环境&&编译本身分成的几个阶段 2.2 运行环境 3....详解编译+链接 2.1 翻译环境&&编译本身分成的几个阶段 组成一个程序的每个源文件通过编译过程分别转换成目标代码。...链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。...符号表最终会在链接中从符号表内部的符号地址从而引用出程序中的函数,因此符号表的重要性是显而易见的。...注意: 参数列表的左括号必须与name相邻。 如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

    55700

    编译、链接到载入、运行的大致过程 ----1. 编译

    对于需要编译的编程语言(c, c++, java, c# ...高级语言),源码写完后,是无法直接运行的;需要有 编译,链接的过程才能生成最终可以执行的二进制文件; 编译: 编译的过程通常包含: A....预编译过程,就是在源代码中进行文本替换工作,比如c中的#include的替换,以及宏定义的替换等;最终输出的依然是 普通的文本文件;在Linux中使用gcc可以用如下命令获得预编译的结果: [root@...编译过程, 这个过程是把预编译的结果进行转换,从而获得对应的汇编语言; [root@www ~]# gcc -S hello.i -o hello.s #手动把预编译的结果 编译为汇编语言...; hello.s: ASCII text [root@www ~]# NOTE: 上面的步骤手动展示了编译的大概过程(预编译--->编译--->汇编),而在实际使用的时候,并不是这样一步步进行操作的..., 直接输出编译的结果;

    50410

    计算机程序的编译和链接

    前言: 在日常的应用程序开发过程中,我们很少需要关注软件的编译和连接过程,特别是对于常用的集成开发环境visual studio,它将编译和链接的过程封装起来,一步完成,称为“构建”。...接下来让我们一起了解软件编译与链接的过程。 一、预处理 预处理过程主要处理那些源代码文件中的以“#”开始的预编译指令。...这里所描述的源码级优化器在不同编译器中可能会有不同的定义或者一些其它差异。...所以现代的编译器可以将一个源代码文件编译成一个未链接的目标文件(比如gcc中通过gcc –c hello.c 会生成hello.o文件),然后由连接器将这些目标文件链接起来形成最终的可执行文件(gcc...中的函数foo(),我们在main.c模块中每一处调用foo函数的时候都必须确切知道foo的函数地址,但是由于每个模块都是单独编译的,在编译器编译main.c的时候它并不知道foo函数的地址(但是由于编译的预处理阶段

    10710

    Linux中的链接文件_软链接和硬链接

    一、链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块领域将数据取出来。...二、两者的区别 硬链接记录的是目标的inode,软链接记录的是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区中做链接。...注:上例中的du命令用来计算文件或者目录的大小,-k表示以KB为单位,这里的4,就指的是4KB;ll命令等同于 ls -l。...在上例中,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接的另外一个限制——不允许目录做硬链接。例: ?

    6.6K30

    【C语言】编译和链接(细节的king)

    以及编译器是如何识别出我们头文件并且加入到我们的代码中的? 这些问题都会随着本文的讲解,大家的脑海就会逐渐出现一个清晰的认知了。 1....第二种是运行环境,它是用于实际代码的执行。 不难想象,多个.c源文件经过编译器的编译和链接器的链接之后,生成的目标文件(.obj)。在经过运行环境下生成可执行文件(.exe),并生成结果。...其实翻译环境是由编译和链接这两个步骤所组成的,而编译又分为预处理(有些书也会成为预编译)、编译和汇编三个过程。...或保留所有的#pragma的编译器指令,编译器后续会使用。 经过预处理之后的.i 文件里就不再包含宏定义,因为宏都已经被展开了。并且包含的头文件的内容都会插入到.i文件中。...查看编译过程结束之后文件的命令: gcc -S test.i -o test.s test.s中的内容其实是汇编代码,看不懂是正常的。 思考一个问题: 假设对下面的代码进行编译时,会怎么做呢?

    8810

    C语言程序编译与链接的奥秘

    本文将结合《程序员的自我修养》一书的内容,深入剖析C语言程序的编译和链接过程,并通过图解的方式,帮助大家巩固上课所学。 一、编译过程 编译过程大致可以分为四个步骤:预处理、编译、汇编和链接。...预处理(Preprocessing) 预处理是编译过程的第一个阶段。在这个阶段,预处理器(如GCC中的cpp)会处理源代码中的预处理指令,如#include、#define等。...源代码.c → 预处理 → 预处理后的代码.i 编译(Compilation) 编译阶段将预处理后的代码转换为汇编代码。编译器(如GCC中的cc1)会检查源代码的语法和语义,并生成对应的汇编指令。...如果代码中存在语法错误或类型不匹配等问题,编译器会报错并停止编译。...汇编代码.s → 汇编 → 目标文件.o 二、链接过程 链接是将多个目标文件以及所需的库文件合并成一个可执行文件的过程。链接器(如ld)负责解析目标文件中的符号引用,并确定每个符号的地址。

    6210

    Linux中的链接文件_软链接和硬链接

    一、链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块领域将数据取出来。...二、两者的区别 硬链接记录的是目标的inode,软链接记录的是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区中做链接。...注:上例中的du命令用来计算文件或者目录的大小,-k表示以KB为单位,这里的4,就指的是4KB;ll命令等同于 ls -l。...在上例中,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接的另外一个限制——不允许目录做硬链接。例: ?

    6.9K30

    C++编译与链接(0)-.h与.cpp中的定义与声明

    void show(){}; 会出现重定义错误 内联函数 为了确保所有调用该inline函数的文件中的定义一样,所以需要是在.h文件中定义 注意这里的inline对于编译器来说只是建议性的,关于该内联函数被拒绝会在下一篇文章中介绍...show@A@@QAEXXZ) 已经在 a.obj 中定义    类的const成员 在类中声明变量为const类型的成员不可以就地初始化 const常量的初始化必须在构造函数初始化列表中初始化,而不可以在构造函数函数体内初始化...inline说明 否则在被include多次时会出现重定义错误 类const数据 ------------------ 不可以 1、在类中声明变量为const类型的成员不可以就地初始化 const常量的初始化必须在构造函数初始化列表中初始化...需要到头文件以外去定义它) 类的静态的常量整形数据成员 ------------------ 可以 特殊说明 模板 模板函数与模板类的声明与实现必须放在一个文件中 至于为什么会这样,与C++的编译和链接...,和编译产生的目标文件(.obj),内部链接,外部链接有关, 我会在接下来的文章中向大家介绍

    3.7K70

    WatchBog新型变种分析

    如关于Cython的文章所述: “Cython是一个优化的静态编译器,它将您的.py模块转换为高性能的C文件。生成的C文件可以毫不费力地编译到二进制库中。...我们可以根据对Pastebin链接的访问次数来估计受感染的受害者数量: ? 如上所示,大约有4,500个端点访问了Pastebin链接。...由于已知WatchBog在6月5日之前一直处于活动状态,其中一些机器可能点击了较旧的Pastebin链接受到感染。 二进制文件首先尝试连接到其中一个可用的静态C2服务器。...这些信息将被合并和取hash值,以构建其CNC中WatchBog API的路径。服务器回复一个“任务”,让机器自动在目标列表上执行: ?...我们发现RDP扫描的IP列表中,一些IP地址属于 Vodafone Australia和Tencent Computer Systems。

    1.2K20

    Linux中的硬链接与软链接?

    inode号,它们的名字不一定相同,但只要inode号一样就行,它们最终都链接到一个文件里,这就是硬链接。...也就是说,当文件的硬链接数被目录记录了一次,文件的硬链接数就增加了一次。所以,文件只要在目录里存在,它就至少有一个硬链接。...(因为引入了对目录的硬连接就有可能在目录中引入循环,在目录遍历的时候系统就会陷入无限循环当中,这样导致无法定位到访问目录)     目录的硬链接数包含目录自身的名字,以及.和子目录里的.. 791422...=(链接数-2) 软连接(符号链接):软连接是一个文件,只不过文件里存放的是别的文件的路径,软连接是一个单独文件,软连接可以通过路径访问源,如果源没了,软连接开始闪烁,找不到源, 软链接创建方式  ln...软连接: 软链接又称之为符号连接。软链接文件类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

    4.3K10

    高级语言的编译:链接及装载过程介绍

    本文的初衷是让工程师对程序源代码如何通过编译器,链接器和装载器最终成为一个进程运行在系统中的整个过程有一个基本的理解,所以并不会涉及到编译器如何通过进行词法分析,语法分析和语义分析最终得到目标二进制文件...第二列表示变量所处的段的类型,比如我们这里看到了有 D,C,b,T 这些类型的段,实际上编译器支持的段类型比这个还多。...在这里我们可以注意到同一个段中的变量相对地址是不能重复的。 第三列表示变量的名字,这里我们看到局部的静态变量名字被编译器修改为 s_a.1597,我们应该能猜得到编译器这么做的原因。...目标文件的链接 通过上一个部分的一个小程序,我们讨论了 C 源码文件的基本组成部分,编译器对这些组成部分的处理以及编译器这么做背后的原理。同时我们也留下了一个需要在其他目标文件中寻找的变量名。...装载运行 上面的几个小节中我们讨论了编译器把一个 C 源码文件编译成一个目标文件需要做的最基本的处理,也讨论了链接器把多个目标文件链接成可执行文件时需要具备的最基本的功能。

    1.4K80

    计算机的翻译(编译和链接)过程

    翻译=编译(预处理+编译+汇编)+链接 1.翻译环境和运行环境: 翻译环境:在这个环境中,源代码被转化为可执行的机器指令(二进制指令)。 运行环境:它用于实际执行代码。...翻译过程:(编译+链接) 翻译过程的要点: 1.源代码中会有多个.c文件,那么这些文件都会单独经过编译器,编译处理生成对应的目标文件。...该过程是递归进行的,也就是说头文件中还有可能包含其他头文件。 上面的删除宏定义,处理条件指令,处理#include预编译指令,都是和#相关的,所以上面三条都是把#处理掉。...gcc -c test.s -o test.o 5.链接: 链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。...程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。(电路板中,嵌入式)在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。 2. 程序的执行便开始。

    12110
    领券