用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成功,等待下一步更新解决方案!