GCC+NASM

高级语言编译全过程:预处理→编译→汇编→链接

纯汇编编译全过程:汇编→链接

【基础知识--编译链接】

1.汇编 / 编译(生成语言无关中间代码)

  -- C→中间语言,ASM→中间语言,DLX→中间语言

  -- 会包含代码,函数定义

  -- 可以是很多个独立文件

  [拓展:中间语言]

  -- 中间语言在计算机科学中,是指一种应用于抽象机器的编程语言。

  -- 源自于编译器,在编译器将源代码编译为目的码的过程中,会先将源代码转换为一个或多个的中间表述,以方便编译器进行代码优化,并产生出目的机器的机器语言。

  -- 中间语言介于高级和低级之间,不像汇编直接面对硬件编程,也不像Java完全隔离于硬件。

2.链接(生成平台相关的可执行二进制代码)

  -- 中间语言→Linux(elf),mac(maco),windows(exe/dll)

  -- 将多个中间文件的代码组合起来

  -- 链接的多个中间文件的函数要声明齐全

3.动态链接和静态链接

   (1)动态链接

      -- 基本思想:把程序的模块相互划分开来,不对这些组成程序的目标文件进行链接,等到程序要运行时才进行链接,即把链接这个过程推迟到了运行时再进行。

      -- 目的:解决空间浪费和更新困难的问题

      -- 过程:在可执行文件装载时或运行时,由OS的装载程序加载库。可执行文件包含一个import directory表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。(这是大多数OS包括windows和linux采用的,还有一种叫动态链接叫运行时链接,这里不赘述)

      -- 类型:可以动态链接的库,Windows上是DLL,UNIX或Linux是Shared Lirary

      -- 缺点:可执行程序依赖分别存储的库文件才能正确执行。若库文件被删除、移动、重命名或被替换为不兼容版本,则可执行程序就可能工作不正常。(DLL-hell)

    (2)静态链接

      -- 基本思想:由链接器在链接时将库的内容加入到可执行程序中的做法。

      -- 缺点:生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间,不能随时更新。

      -- 优点:对SEO(搜索引擎优化)有很大益处,对服务器的负载很小

【基础知识--C函数】

1.声明和定义的区别

  -- 声明只是告诉编译器有这么一个变量 / 函数

  -- 定义是告诉编译器这个变量会占用多少内存,这个函数具体的代码是如何

2.先声明后调用

  -- 标准ascii-c所有的函数都要在使用前先声明。

3.若函数的定义在其它文件,要通过extern指定。

(有的gcc版本若发现函数只有声明没有定义,默认是extern,可不用专门指定)

  -- gcc main.c:编译同时链接,若只有声明,没有函数定义,会报错。

  -- gcc -c main.c:只编译,生成中间文件,链接时给出函数定义即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值