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

Kul*_*007 8 linux glibc

我正在尝试在我没有 root 访问权限的系统上升级 glibc。因此,我安装到本地前缀。我需要一些帮助,以了解设置此功能的最佳实践,以及帮助解决特定问题。(我的问题的快速总结:当我将新安装的 glibc lib 路径包含在我的LD_LIBRARY_PATH.

背景资料:

$ 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
Run Code Online (Sandbox Code Playgroud)

编译器/工具链:我正在运行从 gcc 5.3.0 的源版本本地编译和安装的。它似乎工作正常。这是安装在~/toolchains/gcc_5.3.0

$ ls ~/toolchains/gcc_5.3.0
bin  include  lib  lib32  lib64  libexec  share
Run Code Online (Sandbox Code Playgroud)

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

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

$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64
Run Code Online (Sandbox Code Playgroud)

系统安装的 glibc 版本为 2.19:

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.7) 2.19
Run Code Online (Sandbox Code Playgroud)

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

问题:

我能够使用 gcc 5.3.0 以及系统安装的 gcc 4.8.4 编译和安装 glibc-2.23。编译和安装到 ~/local/ 可以正常工作LD_LIBRARY_PATH。但是,为了利用新的 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
Run Code Online (Sandbox Code Playgroud)

一旦我这样做,我就会尝试运行段错误。我什至不能 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 中定义的,它是 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;

  ^
Run Code Online (Sandbox Code Playgroud)

我很想知道这里是否有其他方法可以访问我的系统无法自行找到的开发头文件和库。上面的错误DIR可能是一个很好的例子。

小智 8

因为 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
Run Code Online (Sandbox Code Playgroud)

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

export LD_LIBRARY_PATH=~/local/lib
~/local/lib/ld-linux-x86-64.so.2 /bin/echo
Run Code Online (Sandbox Code Playgroud)