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. JavaScript 通过身份证号获取出生日期、年龄、性别 、籍贯

    JavaScript 通过身份证号获取出生日期.年龄.性别 .籍贯(很全) 效果图: 示例代码: //由于没有写外部JS,所以代码比较长!!! <!DOCTYPE html PUBLIC &qu ...

  2. 缓冲区溢出分析第05课:编写通用的ShellCode

    前言 我们这次的实验所要研究的是如何编写通用的ShellCode.可能大家会有疑惑,我们上次所编写的ShellCode已经能够很好地完成任务,哪里不通用了呢?其实这就是因为我们上次所编写的ShellC ...

  3. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

  4. 【hugo】- hugo 博客 添加鼠标单击特效

    hugo 博客 监听鼠标点击事件,添加动画效果 js下载 链接:https://pan.baidu.com/s/1SZu76WdEXRxLCfqJ2lbbtQ 密码:r056 移入hugo博客中 打开 ...

  5. Day008 下标越界及小结

    数组的四个基本特点 其长度是确定的.数组一旦被创建,它的大小就是不可以改变的. 其元素必须是相同类型,不允许出现混合类型. 数组中的元素可以是任何数据类型,包括基本类型和引用类型. 数组变量属于引用类 ...

  6. 7个IntelliJ IDEA必备插件,提高编码效率

    1. FindBugs-IDEA 作用: 检测代码中可能的bug及不规范的位置,写完代码后检测下 避免低级bug. 静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷.当然,如果有多年的编写经验 ...

  7. 支付宝手机端网页支付 PHP(基于官方提供的demo)

    1.支付宝开放平台添加应用并且签约快捷手机wap支付(应用添加不做详细说明) 2.下载demo,文档中心SDK&Demo, 3.个人中心秘钥管理,查看商户appID,商户私钥,支付宝公钥,商户 ...

  8. Securecrt 在win7下 字体太少问题

    用WIN7,觉得securecrt里面可用的字体太少了.很多都没有,比如lucida console,经过一番查找,终于找到解决问题的方法了. 原因就是win7里面的很多字体都被设置为隐藏了,所以se ...

  9. Hive解析Json数组超全讲解

    在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...

  10. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...