因为树莓派的glibc版本过低,因此想着去编译2.34版本的glibc,make完成以后,用普通用户身份执行了

sudo make install

系统就G了,执行任何二进制都会报错

Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion `sym != NULL' failed!

网上提示说需要执行ldconfig,但是因为是普通用户,执行完报错

textworld@raspberrypi:~/sonic $ ldconfig
ldconfig: Can't create temporary cache file /etc/ld.so.cache~: Permission denied

通过sudo执行

textworld@raspberrypi:~/sonic $ sudo ldconfig
Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion `sym != NULL' failed!

后来才翻到这篇文章 https://sourceware.org/glibc/wiki/Testing/Builds,正确的安装方式如下

$ DESTDIR=<path to the GLIBC install directory>
$ mkdir $HOME/src
$ cd $HOME/src
$ git clone git://sourceware.org/git/glibc.git
$ mkdir -p $HOME/build/glibc
$ cd $HOME/build/glibc
$ $HOME/src/glibc/configure --prefix=/usr
$ make
$ make check
$ make install DESTDIR=${DESTDIR}
$ make localedata/install-locales DESTDIR=${DESTDIR}
$ make localedata/install-locale-files DESTDIR=${DESTDIR}

其实上面这种方式也是无法正确升级glibc的,正如下面这篇网页中提到的, glibc 2.3.3 prefix /usr/local confustion
提到的

If you wish to be cautious, do not configure with --prefix=/usr. If you don’t specify a prefix, glibc will be installed in /usr/local, where it will probably not break anything. (If you wish to be certain, set the prefix to something like /usr/local/glibc2 which is not used for anything.)
如果不指定prefix,默认会安装在/usr/local中,这样基本不会破坏系统,如果想要更保险一点,那就指定一个哪里都不会用到的路径,如/usr/local/glibc2

但这又是为什么呢?如果我用高版本glibc的ubuntu编译了一个二进制,那么能否在低版本的ubuntu上运行?
怎么样查看一个二进制依赖的glibc版本?
几点知识点

  • ldconfig命令的用处
  • glibc是什么
  • 其他一些文章提到的LD_LIBRARY_PATH是什么