硬件:firefly-RK3399-JD4
软件:ubuntu18.04
需求:在RK3399开发板上进行在线调试。
调试需要用到GDB,之前拿到的gdb运行的时候报错:
提示libm.so.6缺少GLIBC_2.29.
看了一下我拿到的gdb,里面确实有两个函数用到了GLIBC_2.29
而我本地的libm.so.6最高支持GLIBC_2.27
怎么办呢,首先想到的就是更新一下GLIBC到2.29版本,但是GLIBC无法通过apt-get install进行安装,只能下载源码进行make install 。
于是下了2.29的glibc代码
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.23
mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make
然而很快就报错了。
搜了半天在/usr/include/aarch64-linux-gnu/asm里面找到了unistd.h,但是为啥编译的时候找不到呢,看build下生成的config.make文件:
defines =
sysheaders = /usr/include
sysincludes = -nostdinc -isystem /usr/lib/gcc/aarch64-linux-gnu/7/include -isystem /usr/lib/gcc/aarch64-linux-gnu/7/include-fixed -isystem /usr/include
c++-sysincludes = -isystem /usr/include/c++/7 -isystem /usr/include/aarch64-linux-gnu/c++/7 -isystem /usr/include/c++/7/backward
c++-cstdlib-header = /usr/include/c++/7/cstdlib
c++-cmath-header = /usr/include/c++/7/cmath
c++-bits-std_abs-h = /usr/include/c++/7/bits/std_abs.h
这些应该就是设置include文件的,于是在sysincludes后面加上了/usr/include/aarch64-linux-gnu。果然这个错误没有了。但很快又出现了另外一个错误:
找不到setfsuid.o,是stamp.o需要的,搜了一下stamp.o在build下每个文件夹都有,不知道是干嘛的,setfsuid搜了一下是一个syscall接口,glibc里每个syscall编出来都以.o的形式,但是又找不到对应的.c。不知道怎么产生.o的,有的syscall函数是有对应的.c的。在sysd-syscalls文件里可以看到相关的配置。为什么会产生不了呢?而且在misc下面已经产生了一下syscall对应的.o,比如seteuid.o,sbrk.o,sethostid.o,setegid.o,setreuid.o等等,为什么唯独setfsuid.o产生不了?百思不得其解!折腾了半天也没搞定。我在想如果放到x64系统上编译看看会是什么样的情况,于是找了一台Ubuntux64的机器,同样编译2.29版本,果然没有任何问题,连前面的unistd.h的错误都没有报,setfsuid.o也产生了。好奇怪,难道aarch64不行?后来发现我configure的时候用的参数有不一样的。RK3399上用的是:../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
而X64上我用的是:../configure --prefix=/usr/local/glibc
难道跟这个有关,我把两种情况下生成的config.make对比了一下。
主要的差异如下:(左边是报错的,右边是没有报错的)
我比较怀疑是include头文件的那一部分导致,什么都不配的configure,头文件的设置是空的。
于是我又在RK3399上用../configure --prefix=/usr/local/glibc试了一下,果然编译通过了!