LLD-LLVM链接器
LLD是LLVM项目中的链接器,是系统链接器的直接替代,并且运行速度比它们快得多。它还提供了对工具链开发人员有用的功能。
链接器按完整性降序支持ELF(Unix),PE / COFF(Windows),Mach-O(macOS)和WebAssembly。在内部,LLD由几个不同的链接器组成。ELF端口是本文档中将要描述的端口。PE / COFF端口已完成,包括Windows调试信息(PDB)支持。WebAssembly端口仍在开发中(请参阅WebAssembly lld port)。Mach-O端口是基于与其他端口不同的体系结构构建的。有关Mach-O的详细信息,请阅读ATOM-based lld。
特征功能
• LLD是GNU链接器的直接替代,它接受与GNU相同的命令行参数和链接器脚本。
目前正在与FreeBSD项目紧密合作,以使LLD在操作系统的未来版本中成为默认系统链接器,因此非常重视解决兼容性问题。LLD能够链接包括内核在内的整个FreeBSD / amd64基本系统。使用一些正在进行的补丁程序,它可以链接AMD64上大约95%的端口集合。有关详细信息,请参见FreeBSD quarterly status report。
• LLD非常快。在多核计算机上链接大型程序时,可以预期LLD的运行速度是GNU gold链接器的两倍以上。但是,里程可能会有所不同。
• 它支持各种CPU / ABI,包括AArch64,AMDGPU,ARM,Hexagon,MIPS 32/64大/小端,PowerPC,PowerPC64,RISC-V,SPARC V9,x86-32和x86-64。其中,AArch64,ARM(> = v6),PowerPC,PowerPC64,x86-32和x86-64具有生产质量。MIPS似乎也不错。
• 它始终是交叉链接器,这意味着无论它是如何构建的,它始终支持上述所有目标。实际上,没有提供构建时选项来启用/禁用每个目标。链接器轻松用作交叉编译工具链的一部分很容易。
• 可以将LLD嵌入程序中,以消除对外部链接程序的依赖。要做的就是构造目标文件和命令行参数,就像调用外部链接器然后lld::elf::link从代码中调用链接器的主要功能一样 。
• 正在使用LLVM libObject库从目标文件读取数据,因此这并不是一个完全公平的比较,LLD / ELF仅包含2万1千行C ++代码,而GNU gold由19.8万行C ++代码构成。
• 默认情况下支持链接时间优化(LTO)。本质上,要做LTO所需要做的就是将-flto选项传递给clang。然后clang创建的对象文件不是本机目标文件格式,而是LLVM位码格式。LLD读取位码目标文件,使用LLVM对其进行编译并发出输出文件。因为以这种方式LLD可以看到整个程序,所以它可以对整个程序进行优化。
• 古老的Unix系统(90年代以前甚至更早)的一些非常古老的功能已被删除。一些默认设置已进行了调整。例如,默认情况下,将堆栈标记为不可执行以加强安全性。
性能
这是在2插槽20核40线程Xeon E5-2680 2.80 GHz带有SSD驱动器的计算机上的链接时间比较。在有或没有多线程支持的情况下都发挥了作用。为了禁用多线程,添加-no-threads了命令行。

如表所见,lld的速度明显快于GNU链接器。请注意,这只是环境的基准结果。根据可用核心数,可用内存量或磁盘延迟/吞吐量,结果可能会有所不同。
由于GNU ld不支持-icf=all and -gdb-index选项,因此从GNU ld的命令行中删除了。如果拥有这些选项,GNU ld将会比这慢。
构建
如果已经使用SVN检出了LLVM,则可以在tools中像clang一样检出目录下的LLD 。有关详细信息,请参阅Getting Started with the LLVM System。
如果尚未签出LLVM,构建LLD的最简单方法是,从git镜像签出整个LLVM项目/子项目并构建该树。需要cmake,当然也需要C ++编译器。
$ git clone https://github.com/llvm/llvm-project llvm-project
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=lld -DCMAKE_INSTALL_PREFIX=/usr/local …/llvm-project/llvm
$ make install
使用LLD
LLD安装为ld.lld。在Unix上,链接器由编译器驱动程序调用,因此不希望直接使用该命令。编译器驱动程序有几种方法可以使用ld.lld而不是默认链接器。
最简单的方法是覆盖默认链接器。将LLD安装到磁盘上的某个位置后,可以通过创建符号链接来将-s /path/to/ld.lld /usr/bin/ld so that /usr/bin/ld is resolved to LLD其解析为LLD。
如果不想更改系统设置,则可以使用clang的 -fuse-ld选项。这样,-fuse-ld=lld在构建程序时要设置为LDFLAGS。
LLD将其名称和版本号留.comment在输出中的某个部分。如果不确定是否成功使用LLD,运行并检查输出。如果输出中包含字符串“ Linker:LLD”,则说明正在使用LLD。readelf --string-dump .comment

LLD-LLVM链接器相关推荐

  1. LLVM 4中将加入新的LLVM链接器LLD

    LLD将被添加到LLVM 4 rc1中,并默认启用.LLD自称在性能上大大优于GCC ld.虽然该新链接器早可用于构建在用的FreeBSD/amd64基系统(base system),但是这次将其添加 ...

  2. 链接器:绑定符号到地址上

    目录 为什么是编译器 LLVM和LLD LLVM 的编译​​​​​​​的几个主要过程 链接器做了什么 符号链接 动态库链接 实操演示动态库链接​​​​​​​         链接器最主要的作用,就是将 ...

  3. C++异常的幕后3:取悦链接器的ABI

    原文地址:https://monoinfinito.wordpress.com/2013/02/19/c-exceptions-under-the-hood-3-an-abi-to-appease-t ...

  4. 京东区块链白皮书解读, 做“链接器”,一次技术宣言

    前天,京东对外发布了<京东区块链技术白皮书(2018)>. 昨天,京东金融发布了旨在帮助中小银行提升零售信贷效率的产品"北斗×××".目前,"北斗×××&qu ...

  5. 易语言静态连接器提取_易语言静态编译链接器切换工具

    使用说明 将exe程序和"链接器目录配置.ini"文件,复制到易语言安装目录的"tools"文件夹下 并且对"链接器目录配置.ini"进行修 ...

  6. CentOS5.3编译安装mod_jk_1.2.15_链接器_整合apache_httpd和tomcat

    上几次视频 我们安装了 jdk , tomcat , apache ..... 现在我们来做一个整合,也就是当访问 apache 80 端口时候 遇到 jsp 文件也可以正常访问. 如果不整合, 你的 ...

  7. C编译器、链接器、加载器详解

    一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标 ...

  8. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:"Process is fundament ...

  9. 链接器怎样使用静态库来解决符号引用

    链接器在根据命令行中输入的可重定位目标文件和静态库的顺序从左到右的扫描这些文件.在这个扫描中,链接器会维护一个集合E,该集合包含了将来要被合并生产可执行文件的所有可重定位目标文件:维护了一个集合U,包 ...

最新文章

  1. html引入php文件中的函数,在b2core框架和simple_html_dom.php文件里面都有一个load()函数...
  2. linux里的挂载错误无法开机怎么办,Linux基础知识 - 开机挂载错误
  3. java学习(34):巩固练习
  4. ABAP:从例子学习ABAP
  5. SMS部署操作系统后记
  6. 一套开源的 iOS 轻量级框架
  7. 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
  8. 手机处理器排名2019_手机CPU天梯图2020年3月最新版 你的手机处理器排名高吗?...
  9. 勒索病毒 -- “永恒之蓝”NSA 武器免疫工具
  10. js格式化显示xml
  11. ADB各种操作指令详解大汇总
  12. Safari浏览器中工具栏的高度问题
  13. 为什么产品经理都在学画原型?
  14. 10月18日~23日 产品
  15. 块存储、文件存储与对象存储的区别与应用场景
  16. PHP函数array_intersect
  17. 树莓派作品2_莫尔斯电码
  18. sql怎么给字段备注
  19. SpringBoot文件上传下载以及优化过程 -- 个人笔记
  20. PAT乙级 1048. 数字加密(20)

热门文章

  1. 喝可乐问题,2个空瓶换一瓶可乐
  2. 聚集索引和非聚集索引详解 (zhuang)
  3. 数据分析画图:50道练习玩转matplotlib
  4. PC电源的保持时间是用来做什么的?
  5. 信号能量密度公式_信号时频分析方法汇总
  6. Konga arm64 安装
  7. NOIP2016呵呵记
  8. 生成一个5位随机验证码(包含数字大小写字母)
  9. geoserver给天地图添加服务,给线加标注
  10. RHEL8【基础篇】 更改hostname