美文网首页
链接器都做了什么

链接器都做了什么

作者: 景天儿 | 来源:发表于2019-05-27 17:14 被阅读0次

简单说,链接器就是把符号表绑定到地址。
本文是对戴铭专栏中“链接器:符号是怎么绑定到地址上的”的小结。

1 编译型语言、解释型语言

image.png

编译型,执行效率高,调试周期长
解释型,调试方便,执行效率地​

2 LLVM,苹果使用的编辑器工具集合

2-1 lld项目,是内置的链接器

2-2 编译器编译每个文件,生成Mach-O

image.png
Mach-O可执行文件,包括代码(函数定义)和数据(全局变量的定义、初始值)

2-3 链接器将多个Mach-O合并成一个

  1. 完成变量、函数符号 -> 地址的绑定
    ​2. 多文件链接时,会检测命名冲突
  2. 生成最终Mach-O时,自动去掉没有被调用的函数、变量

3 动态库和静态库的链接

3.1 静态库的链接:编译时链接进项目的Mach-O

静态库修改后,整个项目需要重新编译一次

3.2 动态库dylib的链接:运行时通过dyld链接

3.2.1 dyld工作流程

  1. 系统上的动态链接器,使用了共享缓存
  2. 加载Mach-O时,首先检查缓存。
  3. 每个进程,会在自己的地址空间映射这些共享缓存

3.2.2 一个dylib的实际链接和加载流程

3.2.2.1 链接

链接最后,​iOS会用ASLR做地址偏移,避免攻击

3.2.2.1.1 dyld方式加载

编译时参与Mach-O的链接

3.2.2.1.1 通过dlopen/dlsym的方式加载
  1. 编译时不进行Mach-O链接
    ​2. 项目的Mach-O中只有动态库的名字、路径、符号名
    ​3. 项目的Mach-O中不包含动态库的符号表​
    苹果会限制这种App上线​

3.2.2.2 加载

  1. 加载动态库
  2. 填充(绑定)项目Mach-O的符号表中undefined的部分
  3. 处理动态库中的load函数等​​​
  4. 如有依赖的库,递归加载依赖

3.3 命令行工具 xcrun

  1. 可以查看.o文件的链接情况
  2. 可以链接.o文件​

相关文章

  • 链接器都做了什么

    简单说,链接器就是把符号表绑定到地址。本文是对戴铭专栏中“链接器:符号是怎么绑定到地址上的”的小结。 1 编译型语...

  • C高阶编程

    ### main函数执行之前做了什么?(iOS) & dyld 是Apple 的动态链接器;在 xnu 内核为程...

  • 2章 编译和链接

    1. 从源码到可执行件: 4 步 2. 编译器 做了什么 3. 链接器 比 编译器 早出现 (1) 机器指令 + ...

  • (WWDC) Xcode 构建过程的幕后 —— Linker

    接下来,我们将揭晓以下问题的答案: 链接器(linker)实际上做了什么? 什么是符号(symbols)? 什么是...

  • 编译

    编译和链接 编译过程 预编译 生成.i 文件 不包含任何宏定义,宏被展开 编译 汇编 链接 编译器做了什么 词法分...

  • 02--编译过程

    [TOC] 通过本章的学习,要了解到以下几个问题 被隐藏了的过程 编译器做了什么 链接器和编译器 模块拼装——静态...

  • 链接器到底干了什么?

    前言 我们在前文「了解 Mach-O文件」[https://www.jianshu.com/p/22a24a349...

  • 链接器

    本文是< > 第五篇学习笔记. 首先 简单来说,链接器最主要的作用,就是将符号绑定到地址上。 编译器 iOS 开发...

  • 编译器做了什么

    词法分析 语法分析 语义分析 中间语言生成 目标代码生成与优化 其中包括六个步骤:1. 扫描 2. 语法分析 3....

  • 编译器做了什么

    编译器做了什么 从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。 编译的过程一般可以分为6步: ...

网友评论

      本文标题:链接器都做了什么

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