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. poj2418map或者字典树

    题意:      给你一些串,然后求出每个串出现的概率. 思路:      简单题目,做法也很多,我用字典树做了下,然后又用map做了下,其实这个题目我感觉直接排序一遍之后线性输出应该是最简单最快的( ...

  2. 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)

    0x01 介绍 Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用.有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞.编写缓冲区溢出的Exploit分为3个方面:漏洞溢出 ...

  3. PowerShell-6.文件操作

    1.显示文本内容 Get-Content "°C:\\Program Files (x86)\\PsUpdate\\b.dat" 2.得到b.dat文件内容,然后把里面的所有'C' ...

  4. Andrew Ng机器学习算法入门(一):简介

    简介 最近在参加一个利用机器学习来解决安全问题的算法比赛,但是对机器学习的算法一直不了解,所以先了解一下机器学习相关的算法. Andrew Ng就是前段时间从百度离职的吴恩达.关于吴恩达是谁,相信程序 ...

  5. androidstudio2.0引用.so文件

    1.将.so文件复制到libs目录下: 2.在build.gradle中添加下面的代码 sourceSets.main.jniLibs.srcDirs = ['libs'] 结果示例: (上面的1.2 ...

  6. 【opencv】Java实现的opencv3.x版本后Highhui报错

    随笔为博主原创,如需转载,请注明出处. opencv3.x以后Highgui不再使用,用Imgcodecs代替,引入import org.opencv.imgcodecs.Imgcodecs;即可. ...

  7. PHP基础-常用的数组相关处理函数

    一 数组键/值操作有关的函数 1. array_values()//获取数组中所有的值 $lamp=array("os"=>"linux", " ...

  8. 【Docker】7. 镜像-加载原理、分层原理、commit镜像

    一.什么是镜像 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件. 它包含运行某个软件所需的所有内容,包括代码.运行时环境.库.环境变量和配置文件. 所有的应用,直接 ...

  9. [bug] Flask:jinja2.exceptions.UndefinedError: 'None' has no attribute 'id'

    问题 Python Flask做的购物网站,添加购物车时,提示错误 解决 检查发现是MySQL中不正常的空数据导致,删除此条记录即可 参考 https://www.jb51.cc/python/186 ...

  10. [c++] 文件包含

    当一个类用到另一个类时,有两种包含方式,在.h中包含和在.cpp中包含 用到公共类库时,在.h文件中包含(公共类库可视为不变的) 用到项目开发过程中自己或同事写的类时,在.cpp文件中包含(可能根据需 ...