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 <output-file>

LLD-LLVM链接器的更多相关文章

  1. 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的

    解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...

  2. 链接器工具错误 LNK2011

    问题描述: 使用visual studio 2015编译apr-iconv失败,提示"链接器工具错误 LNK2011:未链接预编译对象:映像可能不能运行"错误. 原因分析: MSD ...

  3. 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事

    2.1.3  我的父亲母亲:编译器和链接器 从表面上看,我是由Visual Studio创建的,而实际上,真正负责编译源代码创建生成可执行程序HelloWorld.exe的却是Visual Studi ...

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

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

  5. C++链接器工具错误:LNK2001, LNK2019(转载)

    这是归属于链接器工具错误 这一类. 无法解析的外部符号“symbol” 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 可能的原因 代码请求的内容不存在(例如,符号拼写错误或使 ...

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

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  7. vs2008调试 Release(链接器来生成调试信息)

    VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目— ...

  8. 深入探究VC —— 链接器link.exe(4)

    在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...

  9. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

随机推荐

  1. 【Scrapy(一)】 Scrapy爬虫的基础执行流程

    安装scrapy模块 : pip install scrapy  创建scrapy项目 1.scrapy startprojecty 项目名称  注意:如果创建失败,可以先卸载原有的scrapy模块, ...

  2. 病毒木马查杀实战第014篇:U盘病毒之手动查杀

    在U盘中发现病毒 前段时间需要往虚拟机中拷贝点资料,如同往常一样,插上我的U盘,并且在虚拟机的设置中选择连接U盘.奇怪的是这次的连接时间较以往长,并且还出现了"自动播放"窗口: 图 ...

  3. hdu1316 大数

    题意:      给你一个区间,问这个区间有多少个斐波那契数. 思路:      水的大数,可以直接模拟,要是懒可以用JAVA,我模拟的,打表打到1000个就足够用了... #include<s ...

  4. hdu4768 非常规的二分

    题意:       n个社团给同学发传单,同学一共有1--2^31这么多,每个社团有三个数A ,B ,C ,只有 满足 A ,A + C ,A + C + C ...A + KC <= B 的学 ...

  5. metasploit console 命令解释

    折腾几天,总算是在虚拟机中安装好了4.2版本的metasploit,能够成功打开console,这里将metasploit console的指令用中文翻一下: 原文及翻译: back Move bac ...

  6. ThinkPHP5.1 输出到模板HTML格式被强行转成了字符

    出现问题 控制器传给视图一个input标签,在视图页面显示出来就是 <input type='text'></input>,显示出来的是一个文本,而不是一个可以输入的文本框 解 ...

  7. 【插件篇】前段bootstrap-table-treegrid试手,解决无法显示树形列表或者图标不显示问题。

    说明:具体代码操作我就不贴了.官方有正规的例子!bootstrap-table-examples传送 使用注意事项: 传入的id和pid可以是string类型的(我后台返回的是Long类型转换成str ...

  8. PHP基础-数组

    一.数组的概述 * 1. 数组的本质:管理和操作一组变量,成批处理 * 2. 数组是复合类型 * 3. 数组中可以存储任意长度的数据,也可以存储任意类型的数据 * 4. 数组就可以完成其它语言数据结构 ...

  9. 论文翻译:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation

    我醉了呀,当我花一天翻译完后,发现已经网上已经有现成的了,而且翻译的比我好,哎,造孽呀,但是他写的是论文笔记,而我是纯翻译,能给读者更多的思想和理解空间,并且还有参考文献,也不错哈,反正翻译是写给自己 ...

  10. [bug] java.sql.SQLSyntaxErrorException: Table 'mysql.tb_item' doesn't exist

    参考 https://zhidao.baidu.com/question/146817103.html