本地安装 glibc-2.23 导致所有程序出现段错误

本地安装 glibc-2.23 导致所有程序出现段错误

我正在尝试在没有 root 访问权限的系统上升级 glibc。因此,我正在安装到本地前缀。我需要一些帮助来了解设置此功能的最佳实践,以及帮助解决特定问题。 (我的问题的快速总结:当我在我的 中包含新安装的 glibc lib 路径时LD_LIBRARY_PATH,我尝试运行的每个程序,包括 ls、vim、pwd 等,都会出现段错误。)

背景资料:

$ uname -a
Linux 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

编译器/工具链:我正在运行本地编译并从 gcc 5.3.0 源版本安装的版本。看起来效果很好。这是安装在~/toolchains/gcc_5.3.0

$ ls ~/toolchains/gcc_5.3.0
bin  include  lib  lib32  lib64  libexec  share

尝试安装:glibc-2.23从源代码--prefix=~/local/

我在这台机器上没有 sudo (它是一个共享集群;如果您需要可定制性,策略是安装您自己的工具链,就像我一样)。

$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64

系统安装的glibc版本是2.19:

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.7) 2.19

(在上面和下面,为了清楚起见,我用 ~ 代替上面的绝对路径)

问题:

我可以使用 gcc 5.3.0 以及系统安装的 gcc 4.8.4 来编译和安装 glibc-2.23。当LD_LIBRARY_PATH按上述设置时,编译并安装到 ~/local/ 工作正常。但是,为了利用新的 glibc 库(安装在 ~/local/lib 中),我将 ~/local/lib 添加到当前的末尾LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64:~/local/lib

一旦我这样做,我尝试运行的所有内容都会出现段错误。我什至无法 ls 或运行 vim。我只看到 bash 打印“分段错误”。我必须改变我的LD_LIBRARY_PATH,然后一切都会恢复正常。

我无法运行 gdb 或 strace 或任何东西来尝试弄清楚发生了什么(也有那些段错误)。

问题:

  1. 对这里发生的事情有什么想法吗?

  2. 我感觉我的安装和/或设置方法LD_LIBRARY_PATH不正确。本地安装的 gcc 和本地安装的 glibc 的最佳实践是什么?我需要更仔细地匹配版本吗?我刚刚获取了每个的最新稳定来源。

  3. 据我自己对未来的了解,鉴于 gdb 不起作用,是否有其他方法来调试此类事情,以便我可以精确定位发生段错误的位置?

感谢您的任何想法。

编辑: 我通常会尝试在我的系统上获取一组更新的工具,并获取所需的开发标头和库等。例如,要使用 perf_events 的一些高级功能,我需要一堆其他东西,例如 libaudit。当然,这需要 ldap、berkeley db 等。最终我需要一些似乎只有更现代版本的 glibc 才能提供的标头。例如,这是我尝试编译 berkeley db 时遇到的错误;这种类型似乎是在 dirent.h 中定义的,dirent.h 是 glibc 中的标头,尽管系统在我的系统上安装的软件包中找不到它:

 -fPIC -DPIC -o .libs/os_dir.o

../src/os/os_dir.c: In function '__os_dirlist':

../src/os/os_dir.c:45:2: error: unknown type name 'DIR'

  DIR *dirp;

  ^

我很想知道是否有其他方法可以访问我的系统本身无法找到的开发标头和库。上面的错误DIR也许是一个很好的例子。

答案1

由于 ld-linux-x86-64.so.2 (man ld.so) 和 libc.so 不匹配。

如果要在 LD_LIBRARY_PATH 设置下运行 gdb,请运行如下:

export LD_LIBRARY_PATH=~/local/lib
/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /usr/bin/gdb /bin/ls

这将在旧库环境中运行 /usr/bin/gdb ,在新库环境中运行 /bin/ls 。同样,在新的库环境中只能运行一个命令,如下所示:

export LD_LIBRARY_PATH=~/local/lib
~/local/lib/ld-linux-x86-64.so.2 /bin/echo

相关内容