用lld替代gld生成glibc

2023-11-06

用lld替代gld生成glibc

首先明确,lld是llvm中的链接器,要使用lld替代gld,则要先生成lld,然后再做个软链接使gnu找gld的时候找到的是lld,这样算是替代成功,其中会遇到很多问题,逐个击破最终成功使用lld生成glibc为成功标志。要装llvm,必须要有的工具有:cmake、ninja,这样才能快速生成一套llvm工具链,其余方式过于繁琐,所以,先准备这两个工具(因为本人装的环境特殊,所以很多东西是有的,也没有使用sudo,自己的虚拟机可能很多命令需要sudo自行添置。新机或者docker则还要提前准备安装很多东西,如:先sudo apt-get update,装git,python,sudo apt-get install git python):

1、 cmake安装:

cmake是一个用于自动生成Makefile或project文件的工具。我们知道make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式,通过调用makefile文件中用户指定的命令来进行编译和链接的。所以,make命令本身就是在执行makefile,而cmake命令就是配置CMakeLists.txt文件,将其转化为make所需要的makefile文件并编译生成可执行程序等。
简单的说,cmake 就是一个make maker。
安装过程:

git clone --recursive https://github.com/Kitware/CMake/(慢的话把https:换Git:);

然后进入到CMake文件夹,找到bootstrap,依次执行:

./bootstrap #(构建出项目环境);
make
make install
cmake –version #查看是否已经安装;

注:安装cmake时,首先不要apt-get install cmake,apt-get install cmake下载的cmake版本过低,在构建的时候会出现cmake报错:

CMake 3.13 or higher is required. You are running version 3.5.1;

*这样装出来的cmake反正我用不了,还是Git克隆吧,另外,因为cmake工具的安装需要提前有OpenSSL密码库(没有OpenSSL可能Could Not Find OpenSSL),所以若是机器上没有要先安装OpenSSL相关的软件包,可以Git,也可以直接安装: sudo apt-get install openssl apache2 libssl-dev bless;*

2、 ninja安装:

git clone --recursive https://github.com/ninja-build/ninja/

克隆完进入到ninja文件夹,找到configure.py文件,注意到后缀为.py,所以执行时需要Python支持,新机没装Python要先装Python,装完根据 *https://github.com/ninja-build/ninja/readme.md* 所述直接执行 ./configure.py --bootstrap还是不行滴,此时还差一个re2c,也要先装上;

apt-get install python re2c
./configure.py --bootstrap

结果:
bootstrapping ninja…
wrote build.ninja.
bootstrap complete. rebuilding…
[34/34] LINK ninja

执行到此,以为已经正确安装ninja了,实则不然,ninja --version查看是否已经安装,结果查不到,说明还不能用,(未去验证clone ninja和直接apt-get install ninja-build两种方式哪个更可靠),如果clone安装之后还不可用,则需要再装一个ninja-build,apt-get install ninja-build,再ninja –version就可以查到,也就是安装好了(也许直接apt ninja-build就可以了);

3、 llvm生成:

先clone,再生成:

git clone  --recursive https://github.com/llvm/llvm-project.git

参见https://github.com/mollybuild/RISCV-Measurement/blob/master/Build-RISCV-LLVM-and-run-testsuite.md
clone完成后进入llvm-project文件夹,新建一个build文件夹,cd /(上层目录)/llvm-project;mkdir build && cd build;
先傻不拉几省略好多选项直接cmake,出现了很多问题:
cmake -DLLVM_TARGETS_TO_BUILD=“RISCV” -DLLVM_ENABLE_PROJECTS=“lld” -G Ninja,出现以下问题:
在这里插入图片描述

正确的cmake选项应该是:

cmake -DLLVM_PARALLEL_LINK_JOBS=3 -DLLVM_TARGETS_TO_BUILD="RISCV" -DLLVM_ENABLE_PROJECTS="lld" -G Ninja ../llvm

(-DLLVM_TARGETS_TO_BUILD="RISCV"指定目标机,可以根据自己需求设置X86_64等选项;
-DLLVM_ENABLE_PROJECTS="lld"是指定只构建lld;…/llvm是指定构建文件位置的
,别像我傻呼呼不指定)结果成功构建;
在这里插入图片描述

接下来就是快速生成,因为我们有了ninja,所以,直接执行ninja:

ninja
ninja check-lld #(因为只构建了lld,所以直接ninja check会出错,在自己的虚拟机上构建的时候甚至ninja check-lld也失败,看起来像是缺依赖包之类的原因尚未解决);

直接执行ninja check 或ninja check-all 之类的都会报错,典型的错误如:
在这里插入图片描述

正确执行ninja check-lld 检查结果:

A@p9:~/llvm/llvm-project/build$ ninja check-lld

[0/1] Running lld test suite
llvm-lit: /home/zhangjun/llvm/llvm-project/llvm/utils/lit/lit/llvm/config.py:436: note: using ld.lld: /home/zhangjun/llvm/llvm-project/build/bin/ld.lld
llvm-lit: /home/zhangjun/llvm/llvm-project/llvm/utils/lit/lit/llvm/config.py:436: note: using lld-link: /home/zhangjun/llvm/llvm-project/build/bin/lld-link
llvm-lit: /home/zhangjun/llvm/llvm-project/llvm/utils/lit/lit/llvm/config.py:436: note: using ld64.lld: /home/zhangjun/llvm/llvm-project/build/bin/ld64.lld
llvm-lit: /home/zhangjun/llvm/llvm-project/llvm/utils/lit/lit/llvm/config.py:436: note: using wasm-ld: /home/zhangjun/llvm/llvm-project/build/bin/wasm-ld

Testing Time: 2.28s
  Unsupported: 2303
  Passed     :  441

生成的一步,进入到自己生成的lld的目录去查看是否正确生成了相关lld文件,如ld.lld:
在这里插入图片描述
至此,生成llvm及lld的过程全部完成,下一步,制作软链接替换掉gld作为gnu的链接器。

4、软链接

检查完之后建立软链接到/usr/bin/ld:

ln -sf ./ld.lld /usr/bin/ld #(注意./ld.lld,有伏笔);

此处不加-f选项替换的话会出现链接已存在问题:

ln: failed to create symbolic link '/usr/bin/ld': File exists。

ls -il 发现软链接是红色的,说明无效:
在这里插入图片描述
此时不管它直接往下走,参见:https://maskray.me/blog/2021-01-24-gnu-toolchain#binutils

git clone https://sourceware.org/git/gitweb.cgi=binutils-gdb.git

获取了binutils-gdb之后,进入binutils-gdb目录,

mkdir -p out/debug && cd out/debug;

../../configure --target=x86_64-linux-gnu --prefix=/tmp/opt/binutils-debug --disable-gdb --disable-gdbserver

配置失败:
在这里插入图片描述
查看生成的.log文件:
在这里插入图片描述
到这里怀疑是没有gawk,结果,装了也没用,其实就是软链接的问题,在此构建不成功的情况下又强行想直接尝试构建glibc,于是先准备好原先的glibc,如下:
在Git仓库中克隆glibc,之后创建进入debug:
参见:https://maskray.me/blog/2021-01-24-gnu-toolchain#glibc

git clone https://sourceware.org/git/gitweb.cgi?p=glibc.git

下载glibc,可是不管是点进去还是git clone都下载不了,于是才在github上下,但是其实是网址需要改下,改成

git clone https://sourceware.org/git/glibc.git

由此clone成功;

mkdir -p out/debug;cd out/debug;

按照https://maskray.me/blog/2021-01-24-gnu-toolchain#glibc 所述:

../../configure --prefix=/tmp/glibc/aarch64 --host=aarch64-linux-gnu

出现:
在这里插入图片描述
此后尝试过多个版本的binutils和glibc,都同样报同样的错,最后发现,是软链接的方式问题,之前在生成的ld.lld文件夹中使用:ln -sf ./ld.lld /usr/bin/ld以及ln -sf ld.lld /usr/bin/ld 都是错的,生成的软链接都是无效的,甚至会导致编译器罢工,所以链接时,源文件和目标链接都务必改为绝对路径,如:

ln -sf ~/llvm-project/build/bin/ld.lld /usr/bin/ld

修改之后,软链接不再标红,编译器也恢复正常,在~/binutils-gdb/out/debug$目录中执行:

./../configure --target=x86_64-linux-gnu --prefix=/tmp/opt/binutils-debug --disable-gdb --disable-gdbserver

虽然会有小问题但也正常生成了makefile;
想同时试试其他架构:
…/…/configure --prefix=/tmp/glibc/aarch64 --host=aarch64-linux-gnu
出现:
在这里插入图片描述
原来是还差一个东西:bison,bison是GNU的解析器生成器,新机上没有,所以需要apt安装;安装完之后再配置就正确生成了:
在这里插入图片描述
继续,执行make -r -C ~/Dev/glibc/stdlib objdir=$PWD subdir=stdlib subdir_lib(我自己的目录里面没有Dev/,删掉),出现:
在这里插入图片描述
出现这个问题在configure选项中加:–with-headers=/usr/include,又出现:
在这里插入图片描述
以上,最终总结为自己的机器上缺少某些libXXX库文件,所以未make成功,等待下一步更新解决方案!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用lld替代gld生成glibc 的相关文章

随机推荐

  • 网站服务器评测,9.2分! 浪潮服务器受到海外权威专业评测网站肯定

    目前 浪潮服务器业务覆盖全球120个国家和地区 拥有8个全球研发中心 6个全球生产中心以及2个全球服务中心 海外权威服务器专业评测网站ServeTheHome 简称STH 曾对浪潮NE5260M5边缘服务器进行测评 该服务器斩获9 2的高分
  • threejs实现一个固定大小的3d标点

    需求背景 需要在3d模型上实现标注的功能 一开始是直接通过添加一个普通的mesh来实现的 但是这样就会有一个问题 当视图缩放的时候 标注也会跟着一起放大缩小 影响视觉效果 因此需要实现一个不会随着视图一起放大或者缩小的mesh 实现思路 明
  • MongoDB update数据语法

    mongodb更新有两个命令 1 update 命令 db collection update criteria objNew upsert multi criteria update的查询条件 类似sql update查询内where后面
  • Qt自定义窗口部件/控件(实现一个十六进制微调框SpinBox)

    目录 1 自定义Qt窗口部件 控件 2 十六进制微调框 SpinBox 2 1 实现思路 2 2 源码 3 使用方法 3 1 代码添加自定义窗口部件 控件 3 2 Qt设计师添加自定义窗口部件 控件 3 3 运行效果 4 缺点 1 自定义Q
  • tomcat线程池配置

    以Tomcat8为例 配置方式一
  • dependency-check-maven安全漏洞扫描工具介绍

    目录 dependency check maven安全漏洞扫描工具介绍 dependency check maven插件 重点参数解析 运行命令 检查单个maven工程安全漏洞 检查多个maven子工程汇总一个报告 命令行方式运行 扫描报告
  • 压缩感知(Compressed sensing)from wiki

    压缩感知 Compressed sensing 也被称为压缩采样 Compressive sampling 或稀疏采样 Sparse sampling 是一种寻找欠定线性系统的稀疏解的技术 压缩感知被应用于电子工程尤其是信号处理中 用于获取
  • Java继承和多态之接口

    Java继承和多态之接口 题目要求 仔细阅读右侧编辑区内给出的代码框架及注释 在 Begin End 中实现两个数的求和运算和比较 具体要求如下 编写程序 实现两个数的求和运算和比较 请在下面的Begin End之间按照注释中给出的提示编写
  • CVPR2021 视频目标检测——MM-DistillNet 基于多模态知识提取的自监督多目标检测与跟踪论文笔记/附原文和代码

    本文是CVPR2021最新的视频目标检测的论文 原文地址 https arxiv org abs 2103 01353v1 代码 https github com robot learning freiburg MM DistillNet
  • 028:vue上传解析excel文件,列表中输出内容

    第028个 查看专栏目录 VUE element UI 专栏目标 在vue和element UI联合技术栈的操控下 本专栏提供行之有效的源代码示例和信息点介绍 做到灵活运用 1 提供vue2的一些基本操作 安装 引用 模板使用 comput
  • python3 numpy详解

    基础操作 import numpy as np np创建数组 a np array 1 2 3 print a print type a a2 np array range 10 print a2 print type a2 numpy特有
  • DDoS攻击的三种类型

    如其名称所示 拒绝服务 DoS 攻击是为了使任何类型的服务无法访问 举例来说 关闭对外部在线资产如电子商务网站的访问构成拒绝服务 分布式拒绝服务 DDoS 的主要目的是防止服务被使用并被破坏 而不是试图破坏目标的安全范围 DDoS攻击针对服
  • Wix学习整理(6)——安装快捷方式

    一 为HelloWorld案例添加安装快捷方式 通常我们安装一个应用软件的时候 都喜欢在桌面或开始菜单中添加快捷方式以便我们快速访问 现在我们就在上篇添加注册信息的基础上为HelloWorld的安装包添加安装快捷方式 下面我们将以安装开始菜
  • SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页?

    SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页 1 检验批10000000509是采购订单收货后触发的检验批 执行事务代码QE01 为检验批10000000509录入检验结果 输
  • 【单片机毕业设计】【mcuclub-306】万年历电子时钟

    设计简介 项目名 基于单片机的万年历电子时钟的设计 基于单片机的多功能时钟的设计 基于单片机的数字时钟的设计 单片机 STC89C52 功能简介 1 通过DS1302实时获取时间 并掉电保存时间 2 通过DS18B20获取环境温度值 3 通
  • lodash的2个数组对象操作

    根据数组对象 下的属性名称 来返回相应 的值 数据格式如下 var data test1 test2 test3 test4 test5 var key test1 对象的每个属性名称不是相同的 对应的值 是一个数组 方法1 将data初始
  • C语言中的逻辑判断

    C语言中的逻辑判断 C语言中的逻辑判断是以真和假来表示的 0为假 一切非零为真 这里举几个例子 来让读者更加深入地了解判断语句 逻辑值 int a 5 int b 3 int c a gt b 我们来看c的结果 这时c 1 因为a gt b
  • android 9安装教程,android 9.x 实现应用内更新安装

    折腾了3天 总算解决了问题 依赖如下 implementation androidx core core 1 0 2 implementation com android support support compat 28 0 0 supp
  • 【题目】pyCharm 专业版 和 社区版的区别以及如何查看其版本

    时间 2018 09 22 题目 pyCharm 专业版 和 社区版的区别以及如何查看其版本 参考链接 https zhidao baidu com question 584331885111670725 html 一 pyCharm 专业
  • 用lld替代gld生成glibc

    用lld替代gld生成glibc 首先明确 lld是llvm中的链接器 要使用lld替代gld 则要先生成lld 然后再做个软链接使gnu找gld的时候找到的是lld 这样算是替代成功 其中会遇到很多问题 逐个击破最终成功使用lld生成gl