1. 背景
工作的Linux服务器GLIBC的版本较低,ARM官网下载的工具链运行不了,升级系统的GLIBC存在较大风险,决定自己编个GLIBC用于运行arm-none-eabi-gcc。
$ ./arm-none-eabi-gcc
./arm-none-eabi-gcc: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./arm-none-eabi-gcc)
2. 下载源码
去GLIBC官网下载The GNU C Library (glibc),也可以去阿里云开源镜像站下载,版本越新对依赖的要求越高,我选择的是glibc-2.17.tar.xz版本。
3. 编译
# 解压并创建编译目录
tar -xf glibc-2.17.tar.xz
mkdir glibc-2.17/build && cd glibc-2.17/build
# 配置编译参数,--prefix用于修改安装路径,大约30s
../configure --prefix=/home/xflm/apps/glibc-2.17 --disable-profile --enable-add-ones --with-headers=/usr/include --with-binutils=/usr/bin > configure.txt 2> &1
# 开始编译,-j16启用16个线程进行编译,根据电脑的核心数来定,大约12分钟
make -j16 > compile.txt 2>&1
# 安装到指定目录,大约2分钟
make install > install.txt 2>&1
4. 运行arm-none-eabi-gcc
$ /home/xflm/apps/glibc-2.17/lib/ld-2.17.so --library-path /home/xflm/apps/glibc-2.17/lib:/lib64:$LD_LIBRARY_PATH ./arm-none-eabi-gcc
arm-none-eabi-gcc: fatal error: no input files
compilation terminated.
5. 插曲
5.1 编译GLIBC
- 我下载了更高版本的glibc在
./configure
配置过程中提示我电脑的bison
版本较低,不满足要求,无奈放弃了。 - 编译时我尝试去掉
--disable-profile --enable-add-ones --with-headers=/usr/include --with-binutils=/usr/bin
这些参数,但编译时会错误,因为我是使用的不是系统自带的工具链,系统自带的gcc版本较低,我是用了新编译安装的gcc,不加这些参数GLIBC默认使用gcc提供的参数,可能会导致问题,就不去深究了。
5.2 运行arm-none-eabi-gcc
最开始我使用下面方法运行失败,之后查找到现在的调用方法。
$ LD_LIBRARY_PATH=/home/xflm/apps/glibc-2.17/lib:$LD_LIBRARY_PATH ./arm-none-eabi-gcc
./arm-none-eabi-gcc: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument