美文网首页
第2章节 静态链接

第2章节 静态链接

作者: helinyu | 来源:发表于2021-09-14 10:45 被阅读0次

被隐藏的过程: 分解为4个步骤: 预处理(prepressing) 、编译(compilation)、汇编(Assembly) 和 连接(Linking)

2.1.1 预编译

clang -E hello.c -o hello.i // 这里进行了预编译

看一下OC中的代码是如本编译的命令。

预编译主要处理:

  1. 将所有的额#define删除,并展开所有的宏定义
  2. 处理所有条件预编译指令, eg:#if , #endif 等
  3. 处理#include预编译指令,将被包含的文件插入到该编译指令的位置。 Note: 这个过程是递归精心的,也就是说呗包含的文件可能还包含其他文件。
  4. 删除注释
  5. 添加行号和文件名标识, eg: #2 hello.c 2 ,以便于编译时编译器产生调试的行号信心以及用于编译时产生编译错误或警告时能够显示行号。
  6. 保留所有的#pragma编译器指令,因为编译器须使用它们

经过预编译后的.i 文件不包含任何宏定义, 因为所有的宏已经被展开,并且包含的文件也已经被插入到.i 文件中。所以,当我们无法判断宏定义是否正确或投文件包含是否正确时候 —— 可以查看预编译后的文件确定问题。

在xcode上查看预编译的过程:


在右上角选择assistant, 然后再左上角看到有关的预编译选项。

预编译的选项

2.1.2 编译 【核心、复杂】

编译过程是吧预处理完的文件进行一系列 词法分析、语法分析、语义分析 以及优化后生产相应的汇编代码文件。
clang -S hello.i -o hello.s // 将预编译的代码转化为汇编代码
相当于: clang -S hello.c -o hello.s

clang 是一些命令的集合,根据平参数去调用预编译程序,汇编器,连接器

2.1.3 汇编 【相对简单】

汇编器 将 汇编代码转变成机器可以执行的指令。
Note: 这个过程没有复杂的语法、语义、也不需要优化,只是根据汇编指令和机器指令的对照表一一翻译。
as hello.s -o hello.o
相当于: clang -c hello.s -o hello.o

链接 (ld)

使用ld进行对hello.o 进行链接。 需要将一大堆文件链接起来才得到a.out 可执行文件。


看到这样的链接命令

编译器做了什么?

词法分析、语法分析、语义分析、 —— 编译的内容,【暂略】

经历词法、语法、语义分析之后得到的中间代码

2.2.5 目标代码生成与优化

编译器的后端:主要包括代码生成器(code generator) 和目标代码优化器(target code Optimizer) 。

代码生成器: 将中间代码转换成机器代码【这个过程依赖于目标机器】

需要最后连接器生成最终的目标可执行文件

2.3 连接器年龄比编译器长

2.4 模块拼装 —— 静态链接

链接主要过程
决议 链接过程示意图: 目标文件+库 连接器对地址的修正和符号决议

PS:
1》从源代码到最终可之心文件的4个步骤:预编译、编译、汇编、链接
2》 编译的步骤: 词法分析、语法分析、语义分析、中间代码生成、目标代码生成、优化
3》连接的历史和静态链接的一系列基本概念:重定位、符号、符号决议、目标文件、库、运行库等概念。

相关文章

  • 第2章节 静态链接

    被隐藏的过程: 分解为4个步骤: 预处理(prepressing) 、编译(compilation)、汇编(Ass...

  • 程序员的自我修养: 链接 装载 库

    第2部分 静态链接 第2章 编译和链接 禁止转载

  • 操作系统

    • Linux静态链接和动态链接; (转)静态链接和动态链接1、静态链接静态链接方法:#pragma comme...

  • ubuntu常见问题

    1. useradd和adduser的区别链接1链接2 2. 配置静态IP以及DNS的问题配置静态IP配置DNS ...

  • 《程序员的自我修养》笔记4——动态链接

    一、动态链接简介 1.1 静态链接缺点 在 现代操作系统 中,静态链接 会存在以下 2个 问题: 多进程 同时运行...

  • IOS SDK 静态.a库创建调试

    静态库 1、静态库即静态链接库(例如: windows下的.lib、Mac和Linux下的.a); 2、静态库在编...

  • 静态链接

    静态链接 静态链接涉及的内容包含如下 空间地址的分配 符号解析和重定位 静态库链接 本文的测试代码以及其他文件存在...

  • 静态链接

    编译和链接 预处理 编译扫描(词法分析)、语法分析、语义分析(静态语义是编译器所能分析的,动态语义要在运行期才能确...

  • 静态链接

    大多数编译系统提供编译器驱动程序( compiler driver ),它代表用户在需要时调用语言预处理器、编译器...

  • 静态链接

    静态链接 当有两个目标文件时,如何将它们连接起来形成一个可执行文件?其中发生了什么? 使用两个源代码文件作为研究例...

网友评论

      本文标题:第2章节 静态链接

      本文链接:https://www.haomeiwen.com/subject/ujdfgltx.html